【问题标题】:Match anything between quotes except commas匹配引号之间的任何内容(逗号除外)
【发布时间】:2015-05-30 17:13:50
【问题描述】:

我有这个正则表达式:(?<=")(?:\\.|[^"\\])*(?=")

它匹配引号内的每个字符并排除引号本身。

当我尝试使用这样的字符串时:

"one","two","three"

也匹配逗号,所以匹配结果如下:

one
,
two
,
three

有没有办法修改正则表达式以使其排除那些逗号?也就是说,使得输出为:

one
two
three

我需要在正则表达式中排除这些引号,并且不要在匹配结果中包含逗号。

这是我的大正则表达式:

((0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[012])\.\d\d\d\d)|(([0-1][0-9])|([2][0-3])):([0-5][0-9]):([0-5][0-9])|"((?:\\.|[^"\\])*)"

第一部分匹配日期:dd.mm.yyyy

((0[1-9]|[12][0-9]|3[01]).(0[1-9]|1[012]).\d\d\d\d)

第二部分匹配时间:hh:mm:ss

(([0-1][0-9])|([2][0-3])):([0-5][0-9]):([0-5][0 -9])

最后一个应该匹配引号之间的所有字符:

"((?:\.|[^"\])*)"

但正则表达式的最后一部分不能以不排除引号的方式工作。而且,由于某种原因,它会删除用引号括起来的字符串中的所有空格。

输入是带有类似字符串的文本文件:

"AK Pz 310u PI-13-5","23.02.2015","07:45:00","23.02.2015","09:20:00","False","True","23.02.2015","07:40:00","2","Common","AK Pz 310u PI-13-5","Common"

预期的输出是引号中的值数组(当然,没有逗号和引号本身)。我使用这么大的正则表达式来匹配日期和时间的原因是如果它们错了就不应该匹配它们。

【问题讨论】:

    标签: java regex match


    【解决方案1】:

    要使您的正则表达式不匹配逗号,您需要删除环视并使用捕获组来获取双引号之间的内容。因为环视是不匹配任何字符的断言。所以在这个"one","two","three"输入中,你的正则表达式首先匹配one,然后它匹配下面的,,因为逗号也出现在双引号内。

    "((?:\\.|[^"\\])*)"
    

    此正则表达式强制匹配双引号字符串的每个块。

    Java 代码是,

    String value = "\"one\",\"two\",\"three\"";
    Matcher m = Pattern.compile("\"((?:\\\\.|[^\"\\\\])*)\"").matcher(value);
    while(m.find())
    {
        System.out.println(m.group(1));
    }
    

    输出:

    one
    two
    three
    

    DEMO

    【讨论】:

    • 这个看起来确实比我的好,看起来不错!老实说,我什至不知道您可以直接从网站链接。
    • 但是如果你提供的正则表达式是另一个大正则表达式的一部分呢?行得通吗?
    • 是的,它会的。如果没有,请在此处发布更大的正则表达式。
    • 我添加了我的大正则表达式。不幸的是,它不能正常工作
    • 您能否提供输入以及预期的输出?
    【解决方案2】:

    我相信您正在尝试匹配引号之间的每组字母数字字符。如果是这种情况,您可以使用以下正则表达式:

    (?<=")([a-zA-Z0-9]*)*(?=")
    

    我通常使用https://regex101.com/ 之类的网站来测试我的正则表达式。很容易看出为什么事情是匹配的!您也匹配逗号的原因是这些在技术上仍然是撇号之间的字符。

    【讨论】:

    • 这与字母数字字符不匹配。它匹配大写或小写字母。字母数字需要像 [a-zA-Z0-9][a-zA-Z\d] 这样的范围
    • 我傻了,忘了添加那部分。谢谢!
    【解决方案3】:

    为什么不试试这个?

    "(.*?)"
    

    对于字符串“一”、“二”、“三”、“四”:匹配将是:

    one
    two
    three
    four
    

    请看这里:Regex101

    希望对你有帮助。

    【讨论】:

    • 它不会处理转义的引号。
    • 是的,捕获组只是将内容保留为逗号
    猜你喜欢
    • 1970-01-01
    • 2018-06-25
    • 2011-03-27
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    相关资源
    最近更新 更多