2017-04-13 40 views
1

對於我的一個項目,我想用正則表達式創建「塊」。如何用正則表達式創建「塊」

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

當使用Regex101測試我的正則表達式,我來到this結果:

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

這就導致了一個不正確的輸出,因爲

12\x 

仍然得到檢測爲正確字符串,但順序錯誤,它需要按照下面指定的順序,並且不以其他順序。

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

任何人都可以解釋這是如何工作的,爲什麼它以這種方式工作?提前致謝!

+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

編輯:你的第二個正則表達式的工作原理,你能告訴我爲什麼它檢查整個字符串,而不是在第一次發現後停止,就像你發佈的第一個正則表達式一樣嗎? –

回答

1

要匹配\,與x folloed,然後用2個十六進制字符,在字符串中的任何地方,你需要使用

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

regex demo

,迫使它匹配所有非重疊請使用特定的修飾符(如JavaScript/Perl中的/g)或編程語言中的特定函數(.NET中的Regex.Matches,或PHP中的preg_match_all等)。

^(?:\\x[0-9A-Fa-f]{2})+$正則表達式驗證由上述模式組成的整個字符串。這是由於^(字符串的開頭)和$(字符串的末尾)錨定引起的。注意(?:...)+是一個非捕獲組,可以在字符串中重複1次或更多次(由於+量詞)。

一些Java demo

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 

請注意,我們可能會縮短[a-zA-Z][a-z]如果我們添加一個區分大小寫的修飾符(?i)到模式的開始,或者只是使用了Java正則表達式匹配任何字母數字字符\p{Alnum}

String#matches方法總是錨定在默認情況下正則表達式,用它裏面的圖案時,我們不需要領導^和尾隨$錨。

+0

如果我在網站上使用它,它的工作原理。每當我把它放在Java中,它就不再起作用。我使用Java中String的匹配(「\\\\ x [0-9A-Fa-f] {2}」)函數,但它總是告訴我輸出錯誤。 編輯:輸入太早 –

+0

**輸入字符串是什麼,期望的輸出是什麼?** String#matches'方法要求整個字符串匹配模式,就好像它是用'^'和'''錨點。 –

+0

此外,請參閱[本演示](http://ideone.com/zlMKPP),以便*提取所有「有效」出現的「塊」。 –