【问题标题】:Java, extracting words between $ symbolJava,提取$符号之间的单词
【发布时间】:2012-10-21 21:29:50
【问题描述】:

使用Java,我想提取美元符号$之间的单词。

例如:

String = " this is first attribute $color$. this is the second attribute $size$"

我想拉出字符串:colorsize 并将它们放入一个列表中。

我试过了:

Pattern pattern = Pattern.compile("(\\$) .* (\\$)");
Matcher matcher = pattern.matcher(sentence);

但我得到了输出:

"$color$.this is the second attribute $size$"

最好的方法是什么?

【问题讨论】:

    标签: java regex parsing


    【解决方案1】:

    .*匹配any符号的问题。所以你的模式结果是正确的,因为开头和结尾是美元符号。

    如果美元之间的变量只是字母数字,请使用\$\w+\$

    【讨论】:

      【解决方案2】:

      问题是您使用的正则表达式是贪婪的,并且会消耗从字符串中的第一个 $ 到最后一个 $ 的所有内容。您必须在 * 之后添加 ? 以使正则表达式不贪婪:

      Pattern pattern = Pattern.compile("\\$(.*?)\\$");
      Matcher matcher = pattern.matcher(sentence);
      List<String> result = new ArrayList<String>();
      for(int i=1; i <= matcher.groupCount(); i++)
          result.add(matcher.group(i);
      

      【讨论】:

        【解决方案3】:

        确保单词中不包含美元:(\$)[^$]*(\$)

        或者,不要贪婪,而是使用不情愿的全匹配(\$) .*? (\$)

        【讨论】:

        • 你能告诉我,那些包裹(\$)的括号是什么意思,这和我的答案有什么不同?
        • 括号不是必需的。我猜 OP 将它们放在那里是出于语义原因。
        【解决方案4】:

        试试这个正则表达式。它应该给出预期的结果。

        Pattern pattern = Pattern.compile("\$(.*?)\$");
        

        【讨论】:

          【解决方案5】:

          使用非贪婪匹配找到最小的匹配,您可以使用组只提取没有“$”的单词:

          "\\$(.*?)\\$"
          

          然后在第一组中找到该单词:

          matcher.group(1)
          

          【讨论】:

            【解决方案6】:

            你应该在你的模式中使用非贪婪限定符:

            Pattern pattern = Pattern.compile("\\$(.*?)\\$");
            

            注意星号后面的问号。另外,您可以考虑使用+ 而不是*

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-11-30
              • 1970-01-01
              • 2014-05-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多