[英]Finding words between special characters using Unicode regex
我有一個與以下單詞匹配的工作正則表達式。
輸入:
(T1.Test)
(AT.Test)
匹配:
T1.Test
AT.Test
但是當我嘗試用 unicode \p{L}
替換/w
時,正則表達式不再正常工作。
當前表達式:/(?:\w+\()+|\b(\p{L}+(?:\.\p{L}+)?)\b(?!')/ /(?:\w+\()+|\b(\p{L}+(?:\.\p{L}+)?)\b(?!')/gu
輸入:
(T1.Test)
(AT.Test)
(ワーク.Test)
匹配:
Test
Test
Test
現在我的正則表達式有 unicode 標志,如何讓我的正則表達式正常工作? 我預期的 output 應該是:
T1.Test
AT.Test
ワーク.Test
首先\p{L}
不會捕獲數字,因此(T1.Test)
不會匹配,而與\w
會匹配。
您的正則表達式分為兩個大OR
部分“ 1 | 2
”:
(?:\w+\()+
這個非捕獲組匹配任何形狀anyAmmountOfLetter(
。如果成功將完全忽略正則表達式的 rest,我不知道它是否是故意的。例如,這將觸發您的正則表達式: aaa(333.6780)
與aaa(
完全匹配,但 0 組,因為您沒有捕獲它。
\b(\p{L}+(?:\.\p{L}+)?)\b(?!')
這要求您以單詞邊界開始表達式。 但是 \b 在兩個字符之間有效(正則表達式教程) ,僅當一個是單詞字符而另一個不是時。
在您的情況下,您的起始圓括號不會與單詞邊界匹配,因此(クーク.Test)
將不起作用,但3クーク.Test)
將。
對於您只能使用第二部分的修復(如果確實不需要第一部分來檢查您在問題輸入中顯示的其他內容):
// slight edited, can use digits: (3123.123) => 3123.123
input.match(/[\b]*\(([\d\p{L}]+(?:\.[\d\p{L}]+)?)\)[\b]*(?!')/gu)
// slight edited, must start with letter: (A1.Test) works, (1A.Test) doesn't
input.match(/[\b]*\((\p{L}[\d\p{L}]*(?:\.[\d\p{L}]+)?)\)[\b]*(?!')/gu)
最后一部分\b(?!')
對於您提供的輸入案例也是可選的,但我認為它對於其他目的很有用。
如果您想讓這些輸入的正則表達式保持簡單,這也可以:
// can use digits: (3123.123) => 3123.123
input.match(/\(([\p{L}\d]+(?:\.[\p{L}\d]+))\)/gu)
// must start with letter: (A1.Test) works, (1A.Test) doesn't
input.match(/\((\p{L}[\p{L}\d]*(?:\.[\p{L}\d]+))\)/gu)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.