2009-10-02 60 views
0

我正在使用基於用戶輸入的正則表達式搜索文本的應用程序。用戶擁有的一個選項是使用星號包含「匹配0個或更多個字符」通配符。我需要這個來匹配單詞邊界。我的第一次嘗試是將所有星號轉換爲(?:(?=\B).)*,這對大多數情況來說工作正常。它顯然失敗的地方在於.Net考慮了一個Unicode字符與一個變音符號之間的位置,而另一個字符則是一個斷字符。我認爲這是一個錯誤,並將其提交到Microsoft feedback site正則表達式與unicode變音符的斷字

然而,在此期間,我需要實現功能和產品出貨。我正在考慮使用[\p{L}\p{M}\p{N}\p{Pc}]*作爲替代文本,但坦率地說,我在「我真的不明白這將要做什麼」的土地。我的意思是,我可以閱讀規格說明書,但我不確定我是否可以對此進行充分測試,以確保其符合我的期望。我根本不知道要測試的所有邊界條件。該應用程序由跨文化工作人員使用,其中許多人處於部落地區,因此需要支持任何和所有書寫系統,其中包括一些使用零寬度單詞分隔的書寫系統。

有沒有人有更優雅的解決方案,或者可以確認/更正上面的代碼,或提供一些指針?

感謝您的幫助。

回答

1

/(?:(?=\B).)*/在一個unicode上下文中的等效將是:

/ 
(?: 
    (?: (?<=[\p{L}\p{M}\p{N}\p{Pc}]) (?=[\p{L}\p{M}\p{N}\p{Pc}]) 
    | (?<![\p{L}\p{M}\p{N}\p{Pc}]) (?![\p{L}\p{M}\p{N}\p{Pc}]) 
) 
    . 
)* 
/

...或稍微簡化:

/(?:[\p{L}\p{M}\p{N}\p{Pc}]+|[^\p{L}\p{M}\p{N}\p{Pc}]+)?/ 

這將匹配字詞或一個非字(間距,標點符號等)順序,可能是空的。

正常或否定字邊界(\b\B)基本上是一個雙重環視。一個看後面,確保當前位置之前的字符類型。同樣,展望未來。

在第二個正則表達式中,我刪除了環視並使用簡單的字符類代替。