簡體   English   中英

Java正則表達式轉義逗號

[英]Java regular expression escaped commas

我有一個 csv 文件,我想對它使用String split()方法。 我希望split()返回的數組的每個元素都是 csv 中的逗號分隔值。 但是,csv 文件中還有其他逗號。

幸運的是,這些其他逗號像'\\,'一樣被轉義

我無法為split()方法獲取正確的正則表達式。 我想用前面沒有轉義字符的逗號分隔。

我目前的代碼是:

String[] columns = new String[CONST];
columns = someString.split("*^\\,*");

對我來說這是說:用逗號分隔,但逗號前的字符不能是轉義字符。 逗號前后允許有任意數量的字符。

  1. 如何獲得正確的正則表達式?

首先,逗號在您使用的位置沒有特殊含義,因此您可以省略轉義

正則表達式中最大的問題是, *單獨沒有任何意義。 *表示任何先前標記的出現。

所以正則表達式應該是

.*,.* (我認為轉義逗號應該仍然沒問題.*\\,.*

然后,開始使用,您正在使用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.

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