【问题标题】:Need help in figuring out the right regex pattern需要帮助找出正确的正则表达式模式
【发布时间】:2013-02-27 18:51:19
【问题描述】:

我需要从字符串中提取子字符串:

给定字符串:"< If( ( h == v ) ): { [ < j = (i - f) ;>, < k = (g + t) ;> ] }>" 我需要两个子字符串:"j = (i - f)""k = (g + t)"

为此,我尝试了用户模式正则表达式。这是我的代码:

Pattern pattern = Pattern.compile("[<*;>]");
Matcher matcher = pattern.matcher(out.get(i).toString());
while (matcher.find())
     {
        B2.add(matcher.group());
      }

out.get(i).toString() 是我的输入字符串。 B2 是一个 ArrayList,它将包含两个提取的子字符串。

但是,运行上述代码后,我得到的输出是:[&lt;, &lt;, ;, &gt;, &lt;, ;, &gt;, &gt;]

我的模式不起作用!非常感激你的帮助。 提前致谢!

【问题讨论】:

  • 试试这个网站regexplanet.com
  • 一个问题是[...] 并不代表你认为的那样。这是一个字符类的符号,例如,[abc] 表示“abc”。

标签: java regex


【解决方案1】:

您可以使用表达式&lt;([^&lt;]+);&gt;

这将匹配

之间的内容
Pattern pattern = Pattern.compile("<([^<]+);>");
Matcher matcher = pattern.matcher(out.get(i).toString());
while (matcher.find())
     {
        B2.add(matcher.group(1));
      }

您可以在 regexplanet 上查看结果:http://fiddle.re/5rty6

【讨论】:

    【解决方案2】:

    您的[] 给您带来了麻烦。这些符号的意思是:"match one among the symbols inside of these" 如果你去掉这些,你会得到更好的结果。这样做时,您还必须避开尖括号。

    下一步将是捕获组。您通常为此使用()

    您还必须担心字符串开头的 &lt; 等令人讨厌的伪影,这会弄乱您的正则表达式。为了解决这个问题,您需要从您的正则表达式中排除这些内容。

    你可能会遇到

    "\<([^<>]*?)\>"
    

    作为您的正则表达式。请务必检查特定的 java 文档并转义您的 \ 以获得

    的最终结果
    "\\<([^<>]*?)\\>"
    

    如果您想在尖括号中插入其他 &lt;&gt;,那么正则表达式在这类事情上会遇到很多麻烦,也许您应该尝试不同的方法

    Here's a sample regex

    【讨论】:

    • 非常感谢您的回复!!这很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多