Регулярное выражение для соответствия 3 или более последовательным последовательным символам и последовательным идентичным символам
Мне нужны регулярные выражения для соответствия приведенным ниже случаям.
- 3 или более последовательных последовательных символа/числа; например 123, abc, 789, pqr и т.д.
- 3 или более последовательных идентичных символа/числа; например 111, aaa, bbb, 222 и т.д.
Ответы
Ответ 1
Я не думаю, что вы можете использовать регулярное выражение для первого случая. Второй случай легко:
Pattern pattern = Pattern.compile("([a-z\\d])\\1\\1", Pattern.CASE_INSENSITIVE);
Так как \\1
представляет часть, согласованную с группой 1
, это будет соответствовать любой последовательности из трех одинаковых символов, которые находятся либо в диапазоне a-z
, либо являются цифрами (\d
).
Ответ 2
для второго вопроса:
\\b([a-zA-Z0-9])\\1\\1+\\b
Объяснение:
\\b : zero-length word boundary
( : start capture group 1
[a-zA-Z0-9] : a letter or a digit
) : end group
\\1 : same character as group 1
\\1+ : same character as group 1 one or more times
\\b : zero-length word boundary
Ответ 3
Насколько я знаю, первый случай действительно невозможен. Механизм регулярного выражения ничего не знает о порядке натуральных чисел или алфавита. Но, по крайней мере, можно различать 3 или более чисел и 3 или более букв, например:
[a-z]{3,}|[A-Z]{3,}|\d{3,}
Это соответствует abcd
, ABCDE
или 123
, но не соответствует, например, ab2d
, A5c4
или 12z
. В соответствии с этим второй случай может быть правильно задан в более короткой версии:
(\w)\1{2,}
Ответ 4
Я не согласен, случай 1 доступен для регулярного выражения, но вы должны сказать ему, что последовательности соответствуют..., которые являются довольно длинными и скучными:
/(abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|012|123|234|345|456|567|678|789)+/ig
http://regexr.com/3dqln
Ответ 5
3 или более последовательных последовательных символа/числа ex - 123, abc, 789, pqr и т.д.
Невозможно с регулярными выражениями.
3 или более последовательных одинаковых символа/числа ex - 111, aaa, bbb. 222 и т.д.
Используйте pattern (?i)(?:([a-z0-9])\\1{2,})*
.
Если вы хотите проверить всю строку, используйте Matcher.matches()
. Чтобы найти совпадения в строке, используйте Matcher.find()
.
Вот пример кода:
final String ps = "(?i)(?:([a-z0-9])\\1{2,})*";
final String psLong =
"(?i)\t\t\t# Case insensitive flag\n"
+ "(?:\t\t\t\t# Begin non-capturing group\n"
+ " (\t\t\t\t# Begin capturing group\n"
+ " [a-z0-9]\t\t# Match an alpha or digit character\n"
+ " )\t\t\t\t# End capturing group\n"
+ " \\1\t\t\t\t# Back-reference first capturing group\n"
+ " {2,}\t\t\t# Match previous atom 2 or more times\n"
+ ")\t\t\t\t# End non-capturing group\n"
+ "*\t\t\t\t# Match previous atom zero or more characters\n";
System.out.println("***** PATTERN *****\n" + ps + "\n" + psLong
+ "\n");
final Pattern p = Pattern.compile(ps);
for (final String s : new String[] {"aa", "11", "aaa", "111",
"aaaaaaaaa", "111111111", "aaa111bbb222ccc333",
"aaaaaa111111bbb222"})
{
final Matcher m = p.matcher(s);
if (m.matches()) {
System.out.println("Success: " + s);
} else {
System.out.println("Fail: " + s);
}
}
И результат:
***** PATTERN *****
(?i)(?:([a-z0-9])\1{2,})*
(?i) # Case insensitive flag
(?: # Begin non-capturing group
( # Begin capturing group
[a-z0-9] # Match an alpha or digit character
) # End capturing group
\1 # Back-reference first capturing group
{2,} # Match previous atom 2 or more times
) # End non-capturing group
* # Match previous atom zero or more characters
Fail: aa
Fail: 11
Success: aaa
Success: 111
Success: aaaaaaaaa
Success: 111111111
Success: aaa111bbb222ccc333
Success: aaaaaa111111bbb222
Ответ 6
Спасибо всем за то, что помогли мне.
В первом случае - 3 или более последовательных последовательных символа/числа; например 123, abc, 789, pqr и т.д.. Я использовал ниже логику кода. Поделитесь своими комментариями по этому поводу.
public static boolean validateConsecutiveSeq(String epin) {
char epinCharArray[] = epin.toCharArray();
int asciiCode = 0;
boolean isConSeq = false;
int previousAsciiCode = 0;
int numSeqcount = 0;
for (int i = 0; i < epinCharArray.length; i++) {
asciiCode = epinCharArray[i];
if ((previousAsciiCode + 1) == asciiCode) {
numSeqcount++;
if (numSeqcount >= 2) {
isConSeq = true;
break;
}
} else {
numSeqcount = 0;
}
previousAsciiCode = asciiCode;
}
return isConSeq;
}
Ответ 7
Регулярное соответствие для трех последовательных чисел или алфавитов
"([0-9] | [Aa-Zz])\1\1"
Ответ 8
Если у вас нижняя граница (3) и верхняя граница regexString могут быть сгенерированы следующим образом
public class RegexBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
int seqStart = 3;
int seqEnd = 5;
buildRegex(sb, seqStart, seqEnd);
System.out.println(sb);
}
private static void buildRegex(StringBuilder sb, int seqStart, int seqEnd) {
for (int i = seqStart; i <= seqEnd; i++) {
buildRegexCharGroup(sb, i, '0', '9');
buildRegexCharGroup(sb, i, 'A', 'Z');
buildRegexCharGroup(sb, i, 'a', 'z');
buildRegexRepeatedString(sb, i);
}
}
private static void buildRegexCharGroup(StringBuilder sb, int seqLength,
char start, char end) {
for (char c = start; c <= end - seqLength + 1; c++) {
char ch = c;
if (sb.length() > 0) {
sb.append('|');
}
for (int i = 0; i < seqLength; i++) {
sb.append(ch++);
}
}
}
private static void buildRegexRepeatedString(StringBuilder sb, int seqLength) {
sb.append('|');
sb.append("([a-zA-Z\\d])");
for (int i = 1; i < seqLength; i++) {
sb.append("\\1");
}
}
}
Выход
012|123|234|345|456|567|678|789|ABC|BCD|CDE|DEF|EFG|FGH|GHI|HIJ|IJK|JKL|KLM|LMN|MNO|NOP|OPQ|PQR|QRS|RST|STU|TUV|UVW|VWX|WXY|XYZ|abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|([a-z\d])\1\1|0123|1234|2345|3456|4567|5678|6789|ABCD|BCDE|CDEF|DEFG|EFGH|FGHI|GHIJ|HIJK|IJKL|JKLM|KLMN|LMNO|MNOP|NOPQ|OPQR|PQRS|QRST|RSTU|STUV|TUVW|UVWX|VWXY|WXYZ|abcd|bcde|cdef|defg|efgh|fghi|ghij|hijk|ijkl|jklm|klmn|lmno|mnop|nopq|opqr|pqrs|qrst|rstu|stuv|tuvw|uvwx|vwxy|wxyz|([a-z\d])\1\1\1|01234|12345|23456|34567|45678|56789|ABCDE|BCDEF|CDEFG|DEFGH|EFGHI|FGHIJ|GHIJK|HIJKL|IJKLM|JKLMN|KLMNO|LMNOP|MNOPQ|NOPQR|OPQRS|PQRST|QRSTU|RSTUV|STUVW|TUVWX|UVWXY|VWXYZ|abcde|bcdef|cdefg|defgh|efghi|fghij|ghijk|hijkl|ijklm|jklmn|klmno|lmnop|mnopq|nopqr|opqrs|pqrst|qrstu|rstuv|stuvw|tuvwx|uvwxy|vwxyz|([a-z\d])\1\1\1\1
Ответ 9
-
3 или более последовательных последовательных символа/числа; например, 123, abc, 789, pqr и т.д.
(?:(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){2,}\d|(?:a(?=b)|b(?=c)|c(?=d)|d(?=e)|e(?=f)|f(?=g)|g(?=h)|h(?=i)|i(?=j)|j(?=k)|k(?=l)|l(?=m)|m(?=n)|n(?=o)|o(?=p)|p(?=q)|q(?=r)|r(?=s)|s(?=t)|t(?=u)|u(?=v)|v(?=w)|w(?=x)|x(?=y)|y(?=z)){2,}[\p{Alpha}])
https://regex101.com/r/5IragF/1
-
3 или более последовательных идентичных символа/цифры; например, 111, AAA, BBB, 222 и т.д.
([\p{Alnum}])\1{2,}
https://regex101.com/r/VEHoI9/1
Ответ 10
Все вместе взятые:
([A-Za-Z0-9])\1\1+ | (а | BCD | CDE | Защита | EFG | FGH | ГХИ | Hij | IJK | JKL | кле | ЛМНА | MnO | NOP | OPQ | PQR | квартеры | первый | ст | ТЮФ | UVW | VWX | WXY | хуг | 012 | 123 | 234 | 345 | 456 | 567 | 678 | 789) +
3 или более последовательных последовательных символа/числа; например, 123, abc, 789, pqr и т.д.
(А | BCD | CDE | Защита | EFG | FGH | ГХИ | Hij | IJK | JKL | кле | ЛМНЫ | MnO | NOP | OPQ | PQR | квартеры | первый | ст | ТЮФ | UVW | VWX | WXY | хуг | 012 | 123 | 234 | 345 | 456 | 567 | 678 | 789) +
3 или более последовательных идентичных символа/цифры; например, 111, AAA, BBB, 222 и т.д.
([A-Za-Z0-9])\1\1+
https://regexr.com/4727n
Ответ 11
Все вместе взятые:
([A-Za-Z0-9])\1\1+ | (а | BCD | CDE | Защита | EFG | FGH | ГХИ | Hij | IJK | JKL | кле | ЛМНА | MnO | NOP | OPQ | PQR | квартеры | первый | ст | ТЮФ | UVW | VWX | WXY | хуг | 012 | 123 | 234 | 345 | 456 | 567 | 678 | 789) +
3 или более последовательных последовательных символа/числа; например, 123, abc, 789, pqr и т.д.
(А | BCD | CDE | Защита | EFG | FGH | ГХИ | Hij | IJK | JKL | кле | ЛМНЫ | MnO | NOP | OPQ | PQR | квартеры | первый | ст | ТЮФ | UVW | VWX | WXY | хуг | 012 | 123 | 234 | 345 | 456 | 567 | 678 | 789) +
3 или более последовательных идентичных символа/цифры; например, 111, AAA, BBB, 222 и т.д.
([A-Za-Z0-9])\1\1+
https://regexr.com/4727n
Это также работает:
? (:(?: 0 (= 1) | 1 (= 2) |? 2 (= 3) |? 3 (= 4) |? 4 (= 5) |? 5 (= 6) |? 6 (? = 7) | 7 (= 8) | 8 (= 9)) {2}\д | (:????? а (= Ь) | Ь (= с) | с (= г) | д (= е?) | е (? = е) | F (? = г) | г (? = з) | ч (= я?) | я (? = J) | J (? = к) | к (= л?) | л (? = т) | т (? = п) | п (= о?) | о (? = р) | р (? = д) | д (= г?) | г (? = s) | s (= т) |? Т (= и) |? и (= v) |? v (= ш) | ш (= х) |? х (= у) | у (? = г)) {2,} [[: альфа-:]]) | ([A-Za-Z0-9])\1\1+
https://regex101.com/r/6fXC9u/1
Ответ 12
Попробуйте это для первого вопроса.
возвращает true, если находит в аргументе 3 последовательных числа или алфавита
function check(value){
for (i = 0; i <= val.length - 3; i++) {
var s1 = val.charCodeAt(i);
var s2 = val.charCodeAt(i + 1);
var s3 = val.charCodeAt(i + 2);
if (Math.abs(s1 - s2) === 1 && s1 - s2 === s2 - s3) {
return true;
}
}
return false;
}
console.log(check('[email protected]@100'));
Ответ 13
для первого вопроса это работает, если вы в порядке с меньшим количеством регулярных выражений
containsConsecutiveCharacters(str) {
for (let i = 0; i <= str.length - 3; i++) {
var allthree = str[i] + str[i + 1] + str[i + 2];
let s1 = str.charCodeAt(i);
let s2 = str.charCodeAt(i + 1);
let s3 = str.charCodeAt(i + 2);
if (
/[a-zA-Z]+$/.test(allthree) &&
(s1 < s2 && s2 < s3 && s1+s2+s3-(3*s1) === 3)
) {
return true;
}
}
}