簡體   English   中英

使用正則表達式和轉義符進行Java字符串拆分

[英]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.

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