【问题标题】:Java Regex Capture Text Between """ or '''Java 正则表达式捕获“”或“”之间的文本
【发布时间】:2012-07-10 07:43:56
【问题描述】:

我有一个文档,我正在尝试使用 Java 正则表达式进行解析,并且其中的文本出现在引号中的 """ 或 ''' 中,所以你有:

""" Bla,你不是很好!""" 或:

''' Bla,这1不是一个很好的例子'''

我一直在尝试["""|''']([\p{Alnum}|\p{Blank}]+)[\"""|''']

假设: 文本将以 """ 或 ''' 开头和结尾 文本可以包括数字、字母、空格和标点符号 正文不会包含三个"或三个'的序列

【问题讨论】:

  • 您首先需要使用("""|''') 而不是["""|'''][] 是一个字符类而不是一个组。

标签: java regex


【解决方案1】:

试试这个模式:("""|''').*?\1

给定:

"""Hello, World!""" some unquoted text """ lorem ipsum ''" dolor """ some more unquoted text '''single quotes'''
''' Bla, this 1 isn't a great example '''

它将匹配:

  1. """Hello, World!"""
  2. """ lorem ipsum ''" dolor """
  3. '''single quotes'''
  4. ''' Bla, this 1 isn't a great example '''

您也可能比.*? 更具体,但我不确定您所说的“标点符号”是什么字符。

【讨论】:

  • 这不符合 OP 规范:The body of the text will not include the sequence of three " or three '
  • 好的,那么从第二个例子中去掉'''......有什么区别?如果它确实应该匹配不匹配的引号,那么您可以将 \1 替换为 ('''|""") 但我怀疑是这种情况。
  • 是的,我改变了我的评论,因为这并没有错,只是与示例混淆了。
  • 很公平,我将示例更新为包含''" 以避免混淆。
【解决方案2】:

类似的东西对我有用:

        Pattern p = Pattern.compile("(\"{3}(.*?)\"{3})|('{3}(.*?)'{3})");
        String s1 = "\"\"\" Bla, you're not very nice! \"\"\"";
        String s2 = "''' Bla, this 1 isn't a great example '''";

        Matcher m1 = p.matcher(s1);
        Matcher m2 = p.matcher(s2);

        if (m1.matches())
        {
            System.out.println(m1.group(2));
        }


        if (m2.matches())
        {               
            System.out.println(m2.group(4));
        }

不过,使用 2 个正则表达式会更简单。上面的代码产生了以下结果:

Bla,你不是很好!

Bla,这 1 不是一个很好的例子

您的正则表达式的一个问题是方括号内的任何文本都是OR'D,这意味着管道字符是无用的(作为OR 运算符)。您需要将方括号替换为圆括号。

【讨论】:

  • 不是没用的。字符类中的| 将匹配源文本中的文字|。另一方面,在类中重复字符肯定是没有用的。无论如何它没有实际意义,因为实际的问题是它应该是一个组。
  • @veredesmarald:是的,你说得有道理。我稍微修改了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
相关资源
最近更新 更多