用于查找孤立字符串的字符串的正则表达式

时间:2013-11-07 16:18:42

标签: regex

好的,所以我尝试了一个很好的正则表达式,我只能做到以下几点:

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

但这有几个问题。

首先,我需要我的正则表达式来指出孤儿的确切位置。上述正则表达式适用于<10%< abb123 <asdsad>等案例。

但它也会匹配我不希望看到匹配的<asdad> <asdsad>。它也会匹配 <10% <asdad> <asdsad>最多不到tag2的标志,我将获得<10% <asdad> <

我知道这种情况正在发生,因为我正在使用(.*),但我无法想出一种可以匹配除了&gt;之外的所有东西的方法。两者之间&lt; &lt;,所以像

这样的情况
  `<tag1><tag2>`

不匹配,我可以匹配<tag1><tag2><10%之类的东西,其中小于或小于或小于或大于其他字母,字符和数字。

1 个答案:

答案 0 :(得分:3)

据我了解,您正在尝试查找未跟随相应<字符的>个字符。根据您的示例,我们可以这样做:

<(?![^<]*>)

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

细分,这是:

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

前瞻者会看到它遇到的下一个尖括号是>。由于它是一个负面的预测,如果不是的情况,它会匹配。


更新

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

一些正则表达式引擎有一个\K构造,它允许我们有效地伪造一个可变长度的lookbehind,但Java不是其中之一。因此,我们必须在我们想要的>之前捕获所有内容,然后找到忽略这些字符的方法。

这是一种方式:

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

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

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

细分,这是:

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

这里的想法是我们开始查看该行的开头或者在我们通过的最后一个右括号>之后。我们发现的下一个不匹配的>将在第1组中独自存在。