1

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

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

但这有几个问题。

首先,我需要我的正则表达式指出孤儿小于的确切位置。上面的正则表达式将完美地适用于<10%< abb123 <asdsad>.

但它也会匹配<asdad> <asdsad>我不想看到的匹配。它也将匹配 <10% <asdad> <asdsad>tag2 的小于号,我会得到<10% <asdad> <.

我知道这种情况正在发生,因为我正在使用(.*),但是我很难想出一种方法来提供一种可以匹配所有内容但>在两个<<之间的东西,所以情况如下

  `<tag1><tag2>`

不匹配,我能够匹配类似的东西<tag1><tag2><10%,其中小于后面没有任何其他小于或大于但其他字母、字符和数字。

4

1 回答 1

3

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

<(?![^<]*>)

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

分解,这是:

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

前瞻检查它遇到的下一个尖括号是否是>. 由于它是一个负前瞻,因此如果不是这种情况,它就会匹配。


更新

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

一些正则表达式引擎具有\K允许我们有效地伪造可变长度后视的构造,但 Java 不是其中之一。所以我们必须在>我们想要的之前捕捉到所有的东西,然后想办法忽略那些字符。

这是一种方法:

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

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

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

分解,这是:

  • 一个非捕获组(?:^|>)(因为我们不需要它作为一个单独的组),
  • 一个否定的字符类[^<>\r\n]*,和
  • >其自己的捕获组中的“大于”字符
(?:         # 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

这里的想法是我们开始查看行首或>我们通过的最后一个右括号之后。我们发现的下一个无与伦比的>将单独在第 1 组中。

于 2013-11-07T17:06:35.530 回答