![](/img/trans.png)
[英]How split java string using character which does not have an escape character before it
[英]Java String Split using Regex with Escape Character
我有一個字符串,需要根據定界符(:)進行拆分。 該分隔符可以由字符(例如'?')轉義。 基本上,分隔符可以前面帶有任意數量的轉義符。 考慮下面的示例字符串:
a:b?:c??:d???????:e
在這里,分割后,它應該給出以下字符串列表:
a
b?:c??
d???????:e
基本上,如果定界符(:)前面有偶數個轉義字符,則應拆分。 如果它前面帶有奇數個轉義字符,則不應拆分。 使用正則表達式有解決方案嗎? 任何幫助將不勝感激。
這里早些時候已經問過類似的問題,但是答案不適用於該用例。
更新:使用正則表達式((?:\\ ?. || [^ :?]))*的解決方案正確分割了字符串。 但是,這也很少給出空字符串。 如果用+代替*,則即使是真正的空匹配也將被忽略。 (例如:-a :: b僅給出a,b)
方案1:無空匹配
您可以使用
(?:\?.|[^:?])+
或者,按照鏈接的答案中的模式
(?:\?.|[^:?]++)+
觀看此正則表達式演示
細節
(?:
-開始非捕獲組
\\?.
-一個?
(定界符)后跟任何字符 |
- 要么 [^:?]
-除:
您的定界符char)和?
任何字符?
(轉義字符) )+
-1個或更多重復。 在Java中:
String regex = "(?:\\?.|[^:?]++)+";
如果輸入包含換行符,請在模式前面加上(?s)
(例如(?s)(?:\\\\?.|[^:?])+
),或使用Pattern.DOTALL
標志編譯模式。
方案2:包含空匹配
您可以在上述模式中添加(?<=:)(?=:)
替代項以匹配:
chars之間的空字符串,請參見此regex演示 :
String s = "::a:b?:c??::d???????:e::";
Pattern pattern = Pattern.compile("(?>\\?.|[^:?])+|(?<=:)(?=:)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
System.out.println("'" + matcher.group() + "'");
}
Java演示的輸出:
''
'a'
'b?:c??'
''
'd???????:e'
''
請注意 ,如果您還希望在字符串的開頭/結尾匹配空字符串,請使用(?<![^:])(?![^:])
而不是(?<=:)(?=:)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.