【问题标题】:Regex for finding an orphan less than sign in a string用于在字符串中查找孤儿小于号的正则表达式
【发布时间】:2013-11-07 16:18:42
【问题描述】:

好的,所以我尝试为此提供一个好的正则表达式,但我只做到了以下几点:

(<(.*)(<))|(<(.*)).

但这有几个问题。

首先,我需要我的正则表达式指出孤儿小于的确切位置。上面的正则表达式非常适合&lt;10%&lt; abb123 &lt;asdsad&gt; 等情况。

但它也会匹配我不想看到匹配的&lt;asdad&gt; &lt;asdsad&gt;。也会匹配 &lt;10% &lt;asdad&gt; &lt;asdsad&gt; 直到 tag2 的小于号,我将得到 &lt;10% &lt;asdad&gt; &lt;

我知道这种情况正在发生,因为我正在使用(.*),但我无法想出一种方法来提供一种可以匹配所有内容的方法,但 > 在两个

  `<tag1><tag2>`

不匹配,我可以匹配 &lt;tag1&gt;&lt;tag2&gt;&lt;10% 之类的内容,其中小于后面没有任何其他小于或大于但其他字母、字符和数字。

【问题讨论】:

  • 感谢 Alex 修复它。
  • 你用的是什么口味的?
  • 这只是为了我在java代码中使用。无论 Pattern 类使用什么来编译正则表达式。
  • 您能否添加一些输入示例并突出显示您想要匹配的内容和不想要的内容。
  • 所以基本上你在寻找&lt; 后面没有对应&gt; 的字符? regexr.com?373kl

标签: regex


【解决方案1】:

据我了解,您正在尝试查找后面没有相应 &gt; 字符的 &lt; 字符。适合您的示例,我们可以这样做:

<(?![^<]*>)

例如:http://regexr.com/?373kl

分解,这是:

<        # literal '<' character  
(?!      # negative lookahead
  [^<]*  # 0 or more characters that are not '<'
  >      # literal '>' character
)        # (closing the lookahead)

先行查看它遇到的下一个尖括号是否是&gt;。由于它是一个否定的前瞻,如果 不是,它匹配。


更新

做相反的事情——识别前面没有对应&lt;字符的&gt;字符——要复杂得多。这是因为在大多数正则表达式引擎中,包括 Java 引擎,lookbehinds 必须具有固定长度(即,您不能使用像 +* 这样的量词)。所以我们不能真正使用lookbehind,这在概念上是我们需要的。

一些正则表达式引擎具有\K 构造,它允许我们有效地伪造可变长度的lookbehind,但Java 不是其中之一。所以我们必须捕获我们想要的&gt;之前的所有内容,然后想办法忽略那些字符。

这是一种方法:

(?:^|>)[^<>\r\n]*(>)

例如:http://regexr.com?373m2(将鼠标悬停在匹配项上以查看组)

&gt; 周围有括号,因此它将被单独捕获为一个组。 (这样你可以隔离它并获取它在字符串中的位置。)

分解,这是:

  • 一个非捕获组(?:^|&gt;)(因为我们不需要它作为一个单独的组),
  • 一个否定字符类[^&lt;&gt;\r\n]*,和
  • 一个“大于”&gt; 字符在它自己的capturing group
(?:         # non-capturing group
  ^|>       # ^ start of line or '>' character 
)
[^<>\r\n]*  # 0 or more characters other than '<', '>', or newlines
(>)         # literal '>' character in its own capturing group

这里的想法是,我们开始查看行首或我们通过的最后一个右括号&gt; 之后。我们找到的下一个不匹配的&gt; 将单独在第 1 组中。

【讨论】:

  • 谢谢聪明人。这很有帮助。但是大于的正则表达式不适用于这样的情况:>10% >20%。它与下划线 2 的大于相匹配。还是不错的!
  • 在我链接的示例中似乎工作正常:regexr.com?373no 它在 Java 中的工作方式不同吗?
  • 我在 rubular 中尝试过,但它在大于时不起作用。这是我的正则表达式和测试字符串: (?:^|>)[^\r\n]*(>) >10% >20%
  • @ProgrammerForNow 奇怪。我从您的评论中复制并粘贴了它,它似乎按预期工作。 rubular.com/r/2QHmyCn0ji 请记住,&gt; 本身是在 group #1 中捕获的;忽略整个模式匹配,它也匹配我们不关心的其他字符(例如&gt; &gt;)。
  • 确定。所以,这就是我想知道的。我想可以忽略模式匹配。好吧,这很好。再次感谢。
猜你喜欢
  • 2020-10-06
  • 1970-01-01
  • 2017-06-07
  • 2014-06-19
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
相关资源
最近更新 更多