亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢測全角和半角的空格:正則表達式 VS Character.isWhitespace()

檢測全角和半角的空格:正則表達式 VS Character.isWhitespace()

躍然一笑 2023-08-09 16:55:57
我的任務是檢測服務器應用程序的 csv 中是否存在任何字符串空格。CSV的內容是日語、英語、一些符號和數字的組合。英語中的空格是半角,日語中的空格是全角。兩種語言中空格的寬度和字節大小不同。我正在使用 Java 8 進行編碼,最好不要使用第三方庫。我正在考慮兩種方法,這些是偽代碼。正則表達式:targetStr.matches("\\s+");字符.isWhitespace():targetStr.codepoints()             .filter(c -> Character.isWhitespace(c))             .count() > 0上述偽代碼中的任何一個都可以完成這項任務嗎?哪個對我的情況更有效?
查看完整描述

1 回答

?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

首先,targetStr.matches("\\s+")targetStr.codepoints().filter(c -> Character.isWhitespace(c)).count() > 0承擔完全不同的邏輯。

String.matches要求整個字符串匹配,因此\s+它必須完全由空格組成。相反,count() > 0如果您至少有一個空白字符,則滿足,因此它是 的一種低效且冗長的版本targetStr.codepoints().anyMatch(Character::isWhitespace)

如果你想檢查所有字符是否都是空格,你應該使用allMatch

但進一步來說,空白有不同的定義

Character.isWhitespace:

根據 Java 確定指定字符(Unicode 代碼點)是否為空格。當且僅當一個字符滿足以下條件之一時,它才是 Java 空白字符:

  • 它是 Unicode 空格字符(SPACE_SEPARATOR、?LINE_SEPARATORPARAGRAPH_SEPARATOR),但也不是不間斷空格('\u00A0'、?'\u2007'、'\u202F')。

  • 它是'\t',U+0009 水平制表。

  • 它是'\n',U+000A 換行符。

  • 它是'\u000B',U+000B 垂直制表。

  • 它是'\f',U+000C 換頁。

  • 它是'\r',U+000D 回車。

  • 它是'\u001C',U+001C 文件分隔符。

  • 它是'\u001D',U+001D 組分隔符。

  • 它是'\u001E',U+001E 記錄分隔符。

  • 它是'\u001F',U+001F 單位分隔符。


模式\s(默認):

\s?空白字符:[ \t\n\x0B\f\r]

所以這是有顯著差異的。

您可以\s匹配所有空白字符,或者使用首先匹配所有 unicode 空白字符的模式?;蛘唢@式地引用相同的邏輯Character.isWhitespace,這并不完全相同:

如果你想嚴格應用 的邏輯Character.isWhitespace,你可以使用

  • 匹配所有字符

    • string.codePoints().allMatch(Character::isWhitespace)

    • string.matches("\\p{javaWhitespace}+")

    • string.isBlank()(JDK11)

  • 當至少有一個空白字符 時進行匹配

    • string.codePoints().anyMatch(Character::isWhitespace)

    • string.matches(".*\\p{javaWhitespace}.*")

    • Pattern.compile("\\p{javaWhitespace}").matcher(string).find()

正如文檔的第一個項目符號所述Character.isWhitespace,它將返回false不間斷空格字符 (?'\u00A0',?'\u2007',?'\u202F'),盡管它們具有空白 Unicode 屬性。如果你想將它們匹配為空白,你可以使用

  • 匹配所有字符

    • string.matches("(?U)\\s+")

    • string.matches("\\p{IsWhiteSpace}+")

  • 當至少有一個空白字符 時進行匹配

    • string.matches("(?U).*\\s.*")

    • string.matches(".*\\p{IsWhiteSpace}.*")

    • Pattern.compile("\\p{IsWhitespace}").matcher(string).find()

    • Pattern.compile("\\s", Pattern.UNICODE_CHARACTER_CLASS).matcher(string).find()


查看完整回答
反對 回復 2023-08-09
  • 1 回答
  • 0 關注
  • 345 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號