我想匹配並查找由空格或特殊字符包圍的單詞的索引。例如:正則表達式匹配包含非字母數字字符的單詞
To find: test
this is input test : True
this is#input_ : True
this isinput : False
thisisinputtest: False
this @test is right: True.
我該如何匹配並找到索引。我現在正則表達式失敗:(?i)[^a-zA-Z0-9]test[^a-zA-Z0-9]
我想匹配並查找由空格或特殊字符包圍的單詞的索引。例如:正則表達式匹配包含非字母數字字符的單詞
To find: test
this is input test : True
this is#input_ : True
this isinput : False
thisisinputtest: False
this @test is right: True.
我該如何匹配並找到索引。我現在正則表達式失敗:(?i)[^a-zA-Z0-9]test[^a-zA-Z0-9]
我想你需要什麼你的情況使用lookarounds:
(?<!\p{Alnum})test(?!\p{Alnum})
負回顧後(?<!\p{Alnum})
將失敗的比賽,如果有存在的test
左邊的字母數字字符,並且如果在test
之後存在字母數字字符,則否定前瞻(?!\p{Alnum})
將會使匹配失敗。
見測試截圖:
String str = "this is#test_ :";
Pattern ptrn = Pattern.compile("(?<!\\p{Alnum})test(?!\\p{Alnum})");
Matcher matcher = ptrn.matcher(str);
while (matcher.find()) {
System.out.println(matcher.start());
}
替代辦法:比賽和捕捉到的搜索詞,並打印1日開始位置捕獲組:
Pattern ptrn = Pattern.compile("\\P{Alnum}(test)\\P{Alnum}");
...
System.out.println(matcher.start(1));
看到這個Java demo
注意,在這種情況下,\P{Alnum}
是消費模式,並在一些邊緣情況,test
可能不會得到匹配。
雖然我不清楚這個問題(對不起!),這正是我想要的!非常感謝! – Maxsteel
對於那些只需要字母字符而非字母數字的人,可以使用'「(?<!\\ p {Alpha})test(?!\\ p {Alpha})」' –
@DatNguyen:注意'\ p {Alpha}默認情況下僅使用ASCII字母(如果您未指定'Pattern.UNICODE_CHARACTER_CLASS'標誌)。要匹配任何Unicode字母而不依賴於標誌,請使用'「(?<!\\ p {L})test(?!\\ p {L})」'。 –
我只是想了解你的問題。您正在尋找被特殊角色(包含)或空間包圍的test
? 但你說this is#input_ : True
。我不確定我是否挑選了這個錯誤,但在那種情況下如何是真的?
無論如何,我已經得到了正則表達式[\W\s_](input|test)[\W\s_]
匹配所有您定義爲true的情況。
此外我用戶this網站隨時與我正確的工作,因爲我覺得它非常有用。
不知道這是你想要的答案,但讓我知道,如果我錯了,我會再試一次
這是一個不同的情況下,因爲在我的情況,#test_應該返回測試指標並不#TEST 。 – Maxsteel
「_」是一個單詞,不是特殊字符。此外,'這是#input_'不能是'True',那裏有'test'這個詞在那裏?測試用例中缺少'#test_'。 –
*非字母數字。此外,在一場比賽中,我想要「測試」的索引。所有其他的例子給出了完整的匹配! – Maxsteel