2017-04-13 1 views
1

私のプロジェクトでは、Regexで「ブロック」を作成したいと思います。Regexでブロックを作成するには

\xyz\yzx //wrong format 
x\12 //wrong format 
12\x //wrong format 
\x12\x13\x14\x00\xff\xff //correct format 

私の正規表現をテストするためにRegex101を使用している場合、私はthis結果に来た:

12\x 

が正しいとして検出されますので、これは、誤った出力につながる

([\\x(0-9A-Fa-f)])/gm 

文字列は、順序が間違っていても、以下の順序で指定する必要があります。

backslash x 0-9A-Fa-f 0-9A-Fa-f 

どのように動作するのか、なぜそのように動作するのか説明できますか?前もって感謝します! xでfolloed \に一致するように

+0

これらのブロックのみで構成される文字列を検証する必要があることを意味しますか? ['^(?:\\ x [0-9A-Fa-f] {2})+ $'](https://regex101.com/r/ZUIoqF/3)のように?または、それらのブロックを長い文字列(['\\ x [0-9A-Fa-f] {2}'](https://regex101.com/r/8pFM79/1))にマッチさせる必要がありますか? –

+0

編集:あなたの2番目のRegexが動作します、私はあなたが投稿した最初の正規表現のように、最初の '発見'の後に停止するのではなく、文字列全体をチェックする理由を私に説明できますか? –

答えて

1

は、2進文字で、その後、どこかの文字列で、あなたはそれがすべての非重複を一致させる強制的にregex demo

を参照してください

\\x[0-9A-Fa-f]{2} 

を使用する必要があります特定の修飾子(JavaScript/Perlの/gなど)またはプログラミング言語の特定の関数(.NETの場合はRegex.Matches、PHPの場合はpreg_match_allなど)を使用します。

^(?:\\x[0-9A-Fa-f]{2})+$正規表現は、上記のようなパターンからなる文字列全体を検証します。これは、^(文字列の開始)と$(文字列の最後)のアンカーのために発生します。 (?:...)+は、文字列で1回以上繰り返すことができる非キャプチャグループであることに注意してください(+限定記号のため)。

一部Java demo:我々は、パターンの先頭に大文字小文字を区別しない修飾子(?i)を追加する場合[a-z][a-zA-Z]を短縮する、または単にJavaの正規表現で任意の英数字文字に一致する\p{Alnum}を使用することができ

String s = "\\x12\\x13\\x14\\x00\\xff\\xff"; 

// Extract valid blocks 
Pattern pattern = Pattern.compile("\\\\x[0-9A-Fa-f]{2}"); 
Matcher matcher = pattern.matcher(s); 
List<String> res = new ArrayList<>(); 
while (matcher.find()){ 
    res.add(matcher.group(0)); 
} 
System.out.println(res); // => [\x12, \x13, \x14, \x00, \xff, \xff] 

// Check if a string consists of valid "blocks" only 
boolean isValid = s.matches("(?i)(?:\\\\x[a-f0-9]{2})+"); 
System.out.println(isValid); // => true 

注意。その中にパターンを使用しているときString#matches方法は、常にデフォルトで正規表現を固定する

は、我々は^を先頭と末尾$アンカーを必要としません。

+0

私はこのウェブサイトでこれを使用すれば動作します。私がJavaに入れると、それはもはや機能しません。 Javaで文字列のマッチ( "\\\\ x [0-9A-Fa-f] {2}")関数を使用しますが、常に出力が間違っていることがわかります。 編集:押された入力が遅すぎる –

+0

**入力文字列と期待される出力は何ですか?** 'String#matches'メソッドは文字列全体が'^'で囲まれているかのようにパターンに一致する必要があります。 '$'アンカー。 –

+0

また、あなたの "ブロック"のすべての "有効"な出現を*抽出する方法については、[このデモ](http://ideone.com/zlMKPP)を参照してください。 –

関連する問題