2012-01-16 2 views
14

Мне нужны регулярные выражения для соответствия приведенным ниже случаям.Регулярное выражение для соответствия 3 или более последовательным последовательным символам и последовательным идентичным символам

  1. 3 или более последовательных последовательных символа/цифры; например 123, abc, 789, pqr и т. Д.
  2. 3 или более последовательных идентичных символа/цифры; например 111, aaa, bbb, 222 и т. Д.

ответ

15

Я не думаю, что вы можете использовать регулярное выражение для первого случая. Второй случай легко, хотя:

Pattern pattern = Pattern.compile("([a-z\\d])\\1\\1", Pattern.CASE_INSENSITIVE); 

С \\1 представляет собой часть соответствует группе 1 это будет означать любую последовательность трех одинаковых символов, которые либо в пределах диапазона a-z или являются цифры (\d).

+0

http://stackoverflow.com/questions/22931991/regex-for-consecutive-numbers?lq=1 отметил что действительно возможно сопоставить произвольную длину последовательных символов в строке, если вы определяете правила, для которых следуют символы. – mbomb007

6

второго вопроса:

\\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 
+0

Эта первая часть не является последовательной. – AHungerArtist

+0

@AHungerArtist: Да, вы правы, я неправильно понял вопрос. – Toto

+0

Почему вы используете границы слов? Я не вижу вопроса, заявляющего, что мы ищем поиск слов-слов –

4

Насколько мне известно, первый случай действительно не представляется возможным. Механизм регулярного выражения ничего не знает о порядке натуральных чисел или алфавита. Но это по крайней мере, можно различать 3 или более цифр и 3 или более букв, например:

[a-z]{3,}|[A-Z]{3,}|\d{3,} 

Это соответствует abcd, ABCDE или 123 но не соответствует ab2d, A5c4 или 12z, например. В соответствии с этим, во втором случае может быть правильно дан в более короткие версиях, как:

(\w)\1{2,} 
+0

'\ w' также включает символ подчеркивания' _' – Toto

+0

Конечно, но автор явно не исключал пунктуации. Она упоминала только отдельные символы. Это может быть практически все. Но в любом случае ... – pemistahl

1

Если у Вас есть нижняя грань (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||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 
3

3 или более последовательных последовательные символы/цифры ех - 123, ABC, 789, PQR и др c.

Невозможно с регулярными выражениями.

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 
+0

Ваш первый шаблон будет соответствовать символам, которые не являются последовательными (например, 'vbgt') – Toto

+0

Упс, оставил это. Исправлено. –

+0

Как проверить, имеет ли строка группу из трех или более похожих символов подряд (..... CCC ....), строка не должна содержать 3 последовательных похожих символа. например. он не должен принимать 1. AAA 2. AAAAAAA 3. AAAAR –

2

Спасибо всем за помощь мне.

Для первого случая - 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; 
} 
+0

искусство состоит в том, чтобы написать меньше кода. в этом случае вам нужно найти правильное регулярное выражение. – DragonKnight

2

Regex чтобы соответствовать три последовательные номера или алфавитов "([0-9] | [Aa-Zz]) \ 1 \ 1"

-1

Попробуйте это первый вопрос.

Это напечатает найдено, если он находит 3 последовательных цифр или алфавиты в val переменной:

var val = '[email protected]@100'; 
 

 
var matchfound = false; 
 
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) { 
 
    matchfound = true; 
 
    break; 
 
    } 
 
} 
 

 
if (!matchfound) { 
 
    console.log("not found"); 
 
}

2

Я не согласен, случай 1 можно Regex, но вы должны скажите, что последовательности соответствуют ..., которые являются видными и расточными:

/(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

0

первый вопрос это работает, если вы нормально, без регулярных выражений

  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; 
       } 
      } 
     } 
Смежные вопросы