簡體   English   中英

使用 Unicode 正則表達式在特殊字符之間查找單詞

[英]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 ”:

  1. (?:\w+\()+這個非捕獲組匹配任何形狀anyAmmountOfLetter( 。如果成功將完全忽略正則表達式的 rest,我不知道它是否是故意的。例如,這將觸發您的正則表達式: aaa(333.6780)aaa(完全匹配,但 0 組,因為您沒有捕獲它。

  2. \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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM