用于“不匹配以下之一”的Ruby正则表达式语法

时间:2015-04-01 14:27:02

标签: ruby regex

很简单的正则表达式语法问题。

我有一个文本块,我想找到href="href='的实例,[http://

我可以通过

获得“[

record.body =~ /href=['"](?!\[)/

我可以通过

获得“http://

record.body =~ /href=['"](?!http\:\/\/)/

但我无法弄清楚如何将两者结合起来。

要明确:我想找到像这样的坏字符串

`href="www.foo.com"`

但我很喜欢(即不想找到)像这样的字符串

`href="http://www.foo.com"`
`href="[registration_url]"`

2 个答案:

答案 0 :(得分:1)

alternative list与管道|符号结合使用,以结合前瞻条件:

(?!http\:\/\/|\[)

因此,要匹配href,您可以使用以下正则表达式:

href=\"((?!http\:\/\/|\[)[^\"]+?)\"

请参阅demo on Rubular.com

答案 1 :(得分:1)

使用交替运算符组合两者。

href=['"](?!http\:\/\/|\[)

更具体地说,它会是。

href=(['"])(?!http\:\/\/|\[)(?:(?!\1).)*\1

这将处理href部分中的单引号或双引号字符串。这与href='foo.com"href="foo.com'无法匹配的引号)等字符串不匹配

(['"])会捕获双引号或单引号。 (?!http\:\/\/|\[)并且匹配的引号后面不会跟http://[,如果是,则转到下一个模式。 (?:(?!\1).)*匹配任何字符,但不匹配捕获的字符,零次或多次。 \1后跟捕获的角色。

DEMO