我想創建一個正則表達式以便將字符串拆分爲字典中的單詞。如果字符串匹配,我可以迭代每個組並進行一些更改。一些詞是別人的前綴。然而,像/(HH|HH12)+/
這樣的正則表達式不匹配字符串HH12HH
link。正則表達式有什麼問題?是否應該匹配字符串中的第一個HH12
然後HH
?正則表達式將字符串拆分爲字典中的單詞
回答
要匹配Java中的整個字符串應該只包含HH12
或HH
子。在兩個步驟中做起來要容易得多:1)檢查字符串是否符合要求(這裏是matches("(?:HH12|HH)+")
); 2)提取所有的令牌(這裏是HH12|HH
或HH(?:12)?
,因爲在未錨定的交替組中的第一個選擇「勝出「其餘的都沒有考慮)。
String str = "HH12HH";
Pattern p = Pattern.compile("HH12|HH");
List<String> res = new ArrayList<>();
if (str.matches("(?:HH12|HH)+")) { // If the whole string consists of the defined values
Matcher m = p.matcher(str);
while (m.find()) {
res.add(m.group());
}
}
System.out.println(res); // => [HH12, HH]
另一種方法是一個正則表達式,將檢查字符串是否符合開頭用超前的要求,然後將匹配的連續令牌與\G
操作:
String str = "HH12HH";
Pattern p = Pattern.compile("(\\G(?!^)|^(?=(?:HH12|HH)+$))(?:HH12|HH)");
List<String> res = new ArrayList<>();
Matcher m = p.matcher(str);
while (m.find()) {
res.add(m.group());
}
System.out.println(res);
詳細:
(\\G(?!^)|^(?=(?:HH12|HH)+$))
- 後跟隨着HH12
或HH
((?:HH12|HH)+
)1+序列到字符串的末尾之前的成功匹配(\\G(?!^)
)或字符串(^
)的(|
)開始的端部($
)(?:HH12|HH)
- 要麼HH12
要麼HH
。
太棒了!你覺得這個http://stackoverflow.com/a/16817458/1646996?它也使用'\\ G',但看起來不像這個複雜。 – qqibrow
這取決於你需要什麼,你還沒有精簡。我在我的回答中解釋道:如果您需要確保字符串* only *由滿足您的模式的令牌組成,則必須首先限定字符串以進行標記化。這就是爲什麼我提出了一個更復雜的模式,將'\ G'分成'^(?= ...)'和'\ G(?!^)'。 '\ G(?:HH12 | HH)'只會匹配字符串開頭的多個標記,並且如果字符串中有其他文本,那麼匹配仍然會被收集。 –
在串HH12HH
,正則表達式(HH|HH12)+
會以這種方式工作:
HH12HH
^ - both option work, continue
HH12HH
^ - First condition is entierly satisfied, mark it as match
HH12HH
^- No Match
HH12HH
^- No Match
當你設置好的了A
標誌,錨添加到字符串的開頭,其餘的將不會提高匹配。如果刪除它,該模式將在末尾與起始&處的HH
匹配。
在這種情況下,你有三種選擇:
- 把longuest模式第一
/(HH12|HH)/Ag
。 See demo我更喜歡的那個。 - 相互共享部分並使用可選組
/(HH(?:12)?)/Ag
。 See second demo - 將一個
$
末像這樣/(HH|HH12)$/Ag
您遇到的問題完全與正則表達式引擎決定匹配的方式有關。
正如我解釋here,有一些正則表達式風格,挑選最長的交替......但你沒有使用一個。 Java的正則表達式引擎是另一種類型:使用第一個匹配的交替。
你的正則表達式的作品很多這樣的代碼:
if(bool1){
// This is where `HH` matches
} else if (bool1 && bool2){
// This is where `HH12` would match, but this code will never execute
}
來解決,這是爲了你的話在倒車時,使HH12
HH
之前發生的最好方法。
然後,你可以搭配的改變:
HH12|HH
這應該是很明顯的匹配什麼,因爲你可以得到每場比賽的結果。
(你也可以把它自己的拍攝組中的每個字,但是這是一個有點困難的工作。)
- 1. 使用正則表達式將字符串拆分爲單詞
- 2. 正則表達式拆分字符串
- 3. 正則表達式字符串拆分
- 4. 使用正則表達式將字符串拆分爲單詞數組
- 5. 正則表達式將不同的字符串拆分爲groupdict
- 6. 正則表達式 - 將字符串拆分爲組
- 7. 正則表達式:將字符串拆分爲組
- 8. 將正則表達式字符串拆分爲一個數組
- 9. 正則表達式將字符串拆分爲嵌套數組
- 10. 使用正則表達式將字符串拆分爲多個字符串
- 11. 用正則表達式將字符串拆分爲兩個字符串
- 12. 正則表達式來拆分某些單詞之後的字符串的JavaScript
- 13. 正則表達式將字符串拆分爲數組和字符使用PHP
- 14. 如何使用正則表達式將字符串拆分爲字符?
- 15. Python正則表達式將字符串拆分爲數字和文本/符號
- 16. 正則表達式:使用字典理解和正則表達式將字符串轉換爲字典
- 17. 正則表達式使用關鍵字拆分字符串
- 18. Perl正則表達式,用字拆分字符串
- 19. 在Julia中拆分字符串的正則表達式
- 20. 分割的正則表達式 - 將單詞拆分爲詞素或詞綴
- 21. .NET正則表達式將字符串分割成詞對
- 22. 將字符串拆分爲字典
- 23. 在.NET中使用正則表達式拆分字符串
- 24. 正則表達式在C中拆分字符串#
- 25. 拆分逗號分隔字符串(PHP +正則表達式)
- 26. 拆分給定的字符串使用正則表達式
- 27. PHP的正則表達式來拆分字符串
- 28. 正則表達式拆分引用的搜索字符串
- 29. 拆分最長的正則表達式匹配子字符串
- 30. 包含正則表達式匹配的拆分字符串
什麼'/(HH(?:12)?)+ /' –
@EliSadoff我必須保留'HH'和'HH12',因爲迭代組時我需要知道它是'HH'或'HH12'。此外,這只是一個例子。想象你只有一本字典,'HH'和'HH12'在詞典中。字典中的單詞也在變化。 – qqibrow
切換變化,它首先匹配'HH',然後沒有什麼更匹配。或者在模式的末尾添加'$'。 –