web-dev-qa-db-ja.com

3つ以上の連続した連続文字と連続した同一の文字に一致する正規表現

以下のケースに一致する正規表現が必要です。

  1. 3つ以上の連続する連続した文字/数字。例えば123、abc、789、pqrなど.
  2. 3つ以上の連続する同一の文字/数字。例えば111、aaa、bbb、222など.
20
sandy0093

最初のケースに正規表現を使用できるとは思わない。ただし、2番目のケースは簡単です。

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

\\1はグループ1に一致する部分を表すため、a-zの範囲内または数字(\d)である3つの同一文字のシーケンスに一致します。

16
Milad Naseri

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
7
Toto

私の知る限り、最初のケースは実際に不可能です。正規表現エンジンは、自然数またはアルファベットの順序について何も知りません。しかし、少なくとも3つ以上の数字と3つ以上の文字を区別することは可能です。例えば:

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

これは、abcdABCDE、または123と一致しますが、ab2dA5c4、または12zなどとは一致しません。これによると、2番目のケースは次のように短いバージョンで正しく指定できます。

  (\w)\1{2,}
6
pemistahl

私を助けてくれてありがとう。

最初の場合-つ以上の連続する連続した文字/数字。例: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;
}
3
sandy0093

123以上、abc、789、pqrなど、連続する3つ以上の連続した文字/数字.

正規表現では不可能です。

3つ以上の連続する同一の文字/数字ex-111、aaa、bbb。 222など.

_(?i)(?:([a-z0-9])\\1{2,})*_の pattern を使用します。

文字列全体を確認する場合は、 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
_
3
Dan Cruz

3つの連続した数字またはアルファベットに一致する正規表現は"([0-9] | [aA-zZ])\ 1\1"

2
Gaurav Singh

下限(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
1
Prashant Bhate

最初の質問では、正規表現が少なくても問題ない場合に機能します

         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;
                }
            }
        }
0
Mathijs Segers
  • 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

0

すべてをまとめる:

([a-zA-Z0-9])\ 1\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)+

3つ以上の連続する連続した文字/数字。例えば123、abc、789、pqrなど.

(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)+

3つ以上の連続する同一の文字/数字。例えば111、aaa、bbb、222など.

([a-zA-Z0-9])\ 1\1+

https://regexr.com/4727n

0
JNunez247

すべてをまとめる:

([a-zA-Z0-9])\ 1\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)+

3つ以上の連続する連続した文字/数字。例えば123、abc、789、pqrなど.

(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)+

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、}\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、} [[:alpha:]])|([a-zA-Z0-9])\ 1\1+

https://regex101.com/r/6fXC9u/1

0
JNunez247