簡體   English   中英

正則表達式僅匹配不在括號中的逗號?

[英]Regex to match only commas not in parentheses?

我有一個類似於以下內容的字符串:

12,44,foo,bar,(23,45,200),6

我想創建一個匹配逗號的正則表達式,但只匹配不在括號內的逗號(在上面的示例中,除了 23 和 45 之后的兩個逗號之外的所有逗號)。 我將如何做到這一點(Java 正則表達式,如果有影響的話)?

假設不能有嵌套括號(否則,由於不支持遞歸匹配,您不能為此任務使用 Java 正則表達式):

Pattern regex = Pattern.compile(
    ",         # Match a comma\n" +
    "(?!       # only if it's not followed by...\n" +
    " [^(]*    #   any number of characters except opening parens\n" +
    " \\)      #   followed by a closing parens\n" +
    ")         # End of lookahead", 
    Pattern.COMMENTS);

此正則表達式使用否定前瞻斷言來確保下一個后面的括號(如果有)不是右括號。 只有這樣,逗號才允許匹配。

保羅,重新提出這個問題是因為它有一個沒有提到的簡單解決方案。 (在為正則表達式賞金任務做一些研究時發現了您的問題。)

此外,現有的解決方案會檢查逗號后面是否沒有括號,但這並不能保證它嵌入在括號中。

正則表達式非常簡單:

\(.*?\)|(,)

交替的左側匹配完整的括號集。 我們將忽略這些匹配。 右側匹配並捕獲到 Group 1 的逗號,我們知道它們是正確的逗號,因為它們與左側的表達式不匹配。

在此演示中,您可以在右下方窗格中看到 Group 1 捕獲。

您說要匹配逗號,但您可以使用相同的一般思想進行拆分或替換。

要匹配逗號,您需要檢查第 1 組。這個完整程序在生活中的唯一目標就是做到這一點。

import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.util.List;

class Program {
public static void main (String[] args) throws java.lang.Exception  {

String subject = "12,44,foo,bar,(23,45,200),6";
Pattern regex = Pattern.compile("\\(.*?\\)|(,)");
Matcher regexMatcher = regex.matcher(subject);
List<String> group1Caps = new ArrayList<String>();

// put Group 1 captures in a list
while (regexMatcher.find()) {
if(regexMatcher.group(1) != null) {
group1Caps.add(regexMatcher.group(1));
}
} // end of building the list

// What are all the matches?
System.out.println("\n" + "*** Matches ***");
if(group1Caps.size()>0) {
for (String match : group1Caps) System.out.println(match);
}
} // end main
} // end Program

這是一個現場演示

要使用相同的技術進行拆分或替換,請參閱參考中文章中的代碼示例。

參考

  1. 除了情況 s1、s2、s3 之外,如何匹配模式
  2. 如何匹配模式,除非...

使用負前瞻的正則表達式

,(?![^(]*\))

我不理解這種對正則表達式的痴迷,因為它們不適合它們用於執行的大多數任務。

String beforeParen = longString.substring(longString.indexOf('(')) + longString.substring(longString.indexOf(')') + 1);
int firstComma = beforeParen.indexOf(',');
while (firstComma != -1) {
    /* do something. */
    firstComma = beforeParen.indexOf(',', firstComma + 1);
}

(當然,這假設總是有一個左括號和一個匹配的右括號在它之后的某個時間出現。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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