[英]Java regular expression escaped commas
我有一個 csv 文件,我想對它使用String split()
方法。 我希望split()
返回的數組的每個元素都是 csv 中的逗號分隔值。 但是,csv 文件中還有其他逗號。
幸運的是,這些其他逗號像'\\,'
一樣被轉義
我無法為split()
方法獲取正確的正則表達式。 我想用前面沒有轉義字符的逗號分隔。
我目前的代碼是:
String[] columns = new String[CONST];
columns = someString.split("*^\\,*");
對我來說這是說:用逗號分隔,但逗號前的字符不能是轉義字符。 逗號前后允許有任意數量的字符。
首先,逗號在您使用的位置沒有特殊含義,因此您可以省略轉義
正則表達式中最大的問題是, *
單獨沒有任何意義。 *
表示任何先前標記的出現。
所以正則表達式應該是
.*,.*
(我認為轉義逗號應該仍然沒問題.*\\,.*
)
然后,開始使用,您正在使用String.split()
的正則表達式。 String.split()
期望用於分隔符的正則表達式。 因此,您應該只傳遞,
作為正則表達式。 將.*,.*
作為“分隔符”會給您帶來意想不到的結果(您可以嘗試一下)。
由於我在搜索中點擊了此頁面,因此我將按照所述回答問題並輸入正確的模式(為了完整性):
columns = someString.split("[^\\\\],");
請注意,您需要 4 個轉義字符,因為您需要 2 個轉義字符才能在字符串中創建 1 個轉義字符。 換句話說, "\\\\" 創建字符串 \\ 。 所以“\\\\\\\\”創建字符串\\\\,它轉義正則表達式中的轉義符以在正則表達式中創建字符\\。 因此,您需要在字符串中使用 4 個轉義字符才能在正則表達式中創建一個。 方括號和克拉是作出 not 聲明的一種方式(特別是對於單個字符)。
您還可以將不想用引號拆分的 CSV 條目括起來。 然后使用以下解決方案: Java:拆分逗號分隔的字符串但忽略引號中的逗號。
由於我編碼的環境,我個人的偏好是在第 3 方解析器上使用拆分。
正確的方法是使用解析器(處理\\\\,
\\,
,
)但使用簡單的正則表達式可以工作;
jshell> "a,b".split("(?!\\\\),")
$2 ==> String[2] { "a", "b" }
如何測試不起作用的東西;
jshell> "a,b".split("[^\\\\],")
$1 ==> String[2] { "", "b" }
和
jshell> "a,b".split("*^\\,*")
| java.util.regex.PatternSyntaxException thrown: Dangling meta character '*' near index 0
*^\,*
^
| at Pattern.error (Pattern.java:1997)
| at Pattern.sequence (Pattern.java:2172)
| at Pattern.expr (Pattern.java:2038)
| at Pattern.compile (Pattern.java:1760)
| at Pattern.<init> (Pattern.java:1409)
| at Pattern.compile (Pattern.java:1065)
| at String.split (String.java:2307)
| at String.split (String.java:2354)
| at (#6:1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.