2012-02-15 53 views
5

Oracle Pattern documentation有三種不同的圖案的匹配空白的描述:如何選擇空白圖案?

  1. \ S
  2. \ p {空間}
  3. \ p {javaWhitespace}

我想知道每個人的特殊性以及如何知道如何選擇正確的人。 我剛剛注意到\p{javaWhitespace}包含更多空間類型。

+0

這取決於你最清楚和最需要的東西。你是否需要它將「更多空間類型」視爲空間? – 2012-02-15 10:22:48

+0

是的,我想用它來劃定句子中的單詞。 – 2012-02-15 10:29:53

回答

4

我寧願使用第一個。

  • 它結構緊湊
  • 它在許多其他語言相同的符號,以及在正則表達式的理論
  • \p{javaWhitespace}包括FILE SEPARATORGROUP SEPARATOR,等等看this。當這些不需要時使用它可能會混淆別人。
  • 一般而言,我希望另一位程序員知道\s是什麼,而我期望他們仔細檢查\p{javaWhitespace}的確切定義是什麼。您不需要這樣做,因爲它會降低代碼的清晰度,並在調試過程中增加不必要的負擔。
+0

好的謝謝!在我的情況下,'\ p {javaWhitespace}'對於開發人員來說是透明的,因爲我使用'java.util.Scanner'來迭代字符串中的單詞,並且它是默認的分隔符。所以我想知道我是否應該用'.useDelimiter(「\\ s +」)來改變' – 2012-02-15 10:54:07

0

除非有特別原因需要使用其他選項,我會保持它的簡單和使用\s

+0

所以'\ s'只是寫一個'\ p {Space}'的簡單方法? – 2012-02-15 10:35:38

3

\s是最短的,也可以指定一個空格字符最不可移植的選項。雖然很少將Java代碼移植到其他語言,但更多的是將一個正則表達式引擎的語法知識傳遞給另一個。有很多正則表達式引擎使用Perl語法,因此在解釋上存在差異,像\s這樣的語法會讓程序員感到困惑。

從空間

除了(ASCII 32),新行(\n,ASCII 10),水平製表符(\t,ASCII 9),回車(\r,ASCII 13)和換頁(\f,ASCII 12),有什麼是空格字符不同引擎之間沒有共識。

  • Java,POSIX(ASCII):還包括垂直製表符(ASCII 11)。 Java在這裏似乎遵循POSIX標準。

  • JavaScript(版5.1):根據規格(由字的字),除了5成常見的,它包括:

    • Unicode的類別Zs (Separator/Space)\u2028(行分隔符),\u2029(段落分隔符)。它基本上包括類別Z(分隔符)下的所有字符。

      實際上\u2028Zl (Separator/Line)類別的唯一成員,與\u2029Zp (Separator/Paragraph)類別的唯一成員。根據措辭,目前版本的規格可能會排除對這兩個類別的進一步擴展。

    • 垂直製表\v
    • 字節順序標記又名ZERO WIDTH NO-BREAK SPACE\ufeff
  • Perl,PCRE(ASCII模式):在Perl 5.18加入作爲實驗垂直製表\v。在5.18之前,它只匹配5個常見的。

  • Perl(Unicode模式):除了5周常見的

    • 的Unicode類別Z(隔板)
    • 垂直製表\v加入在Perl 5.18作爲實驗。
    • NEXT LINE(NEL)\u0085
    • MONGOLIAN VOWEL SEPARATOR\u180e
  • .NET(默認):除了5周常見的

    • 的Unicode類別Z(隔板)
    • 垂直選項卡\v
    • 下一行(NEL)\u0085
  • 的Java(Unicode)的:從Java 7,圖案類包含一個新的標誌UNICODE_CHARACTER_CLASS這使得預定義字符類和符合Unicode Technical Standard #18: Unicode Regular ExpressionPOSIX字符類。當該標誌處於活動狀態時,預定義的字符類和相應的POSIX字符類將變成等同的(匹配相同的東西)。

    字符列表與.NET相同。

這足以驅動一個瘋了!


\p{Space}是更「穩定」的選擇,因爲它遵循UNICODE_CHARACTER_CLASS在默認模式下的POSIX standardUnicode Technical Standard #18: Unicode Regular Expression

如果使用POSIX字符類,符合POSIX標準的實施將在ASCII模式相同的行爲,和Unicode正則表達式引擎,遵循建議將有(幾乎)在Unicode模式相同的行爲。

\s\p{Space}在Java中是等效的,無論該標誌如何。如果您在Java中使用\s,則可以確定您正在遵循一些標準/建議。只是它沒有向大多數程序員宣佈這個事實。


\p{isJavaWhitespace}根據Java's definition匹配空格。該函數的名稱極具誤導性。

+0

此答案已被添加到[Stack Overflow Regular Expression FAQ](http://stackoverflow.com/a/22944075/2736496) ,在「角色類」下。 – aliteralmind 2014-04-10 00:20:37