现代正则表达式引擎中有一些功能允许您匹配没有该功能时无法匹配的语言.例如,使用后引用的以下正则表达式匹配由重复自身的单词组成的所有字符串的语言:(.+)\1
.此语言不常规,不能与不使用反向引用的正则表达式匹配.
外观是否也会影响正则表达式可以匹配的语言?即是否有任何语言可以使用无法匹配的外观匹配?如果是这样,对于所有类型的环视(负面或正向前瞻或后观)或仅仅针对其中一些而言,这是真的吗?
例如,下面的正则表达式将导致失败报告lookbehind断言不是固定长度:
#(?<!(?:(?:src)|(?:href))=["\']?)((?:https?|ftp)://[^\s\'"<>()]+)#S
Run Code Online (Sandbox Code Playgroud)
这种限制不存在lookahead
.
为什么正则表达式不(?<=fo).*
匹配foo
(反之(?<=f).*
)?
"foo" =~ /(?<=f).*/m => 1
"foo" =~ /(?<=fo).*/m => nil
Run Code Online (Sandbox Code Playgroud)
这似乎只在单线模式打开时发生(点匹配换行符); 没有它,一切都很好:
"foo" =~ /(?<=f).*/ => 1
"foo" =~ /(?<=fo).*/ => 2
Run Code Online (Sandbox Code Playgroud)
在Ruby 1.9.3和2.0.0上测试过.
编辑:更多观察:
添加行尾锚点不会改变任何内容:
"foo" =~ /(?<=fo).*$/m => nil
Run Code Online (Sandbox Code Playgroud)
但与懒惰的量词一起,它"有效":
"foo" =~ /(?<=fo).*?$/m => 2
Run Code Online (Sandbox Code Playgroud)
编辑:还有一些观察:
.+
与它的等价物一样工作{1,}
,但仅限于Ruby 1.9(在这种情况下,这似乎是两者之间唯一的行为差异):
"foo" =~ /(?<=fo).+/m => 2
"foo" =~ /(?<=fo).{1,}/ => 2
Run Code Online (Sandbox Code Playgroud)
在Ruby 2.0中:
"foo" =~ /(?<=fo).+/m => nil
"foo" =~ /(?<=fo).{1,}/m => nil
Run Code Online (Sandbox Code Playgroud)
.{0,}
被破坏(1.9和2.0):
"foo" …
Run Code Online (Sandbox Code Playgroud) 我试图在正则表达式中使用lookbehinds,它似乎不像我预期的那样工作.所以,这不是我的真实用法,但为了简化,我将举一个例子.想象一下,我想在"这是一个例子"的字符串上匹配"example".所以,根据我对外观的理解,这应该有效:
(?<=this\sis\san\s*?)example
Run Code Online (Sandbox Code Playgroud)
这应该做的是找到"这是一个",然后是空格字符,最后匹配单词"example".现在,它不起作用,我不明白为什么,在外观中使用'+'或'*'是不可能的?
我也试过这两个,他们工作正常,但不满足我的需求:
(?<=this\sis\san\s)example
this\sis\san\s*?example
Run Code Online (Sandbox Code Playgroud)
我正在使用此站点来测试我的正则表达式:http://gskinner.com/RegExr/
我创建了一个测试使用,grep
但它不起作用sed
.
grep -P '(?<=foo)bar' file.txt
Run Code Online (Sandbox Code Playgroud)
这可以通过返回正常工作bar
.
sed 's/(?<=foo)bar/test/g' file.txt
Run Code Online (Sandbox Code Playgroud)
我期待footest
作为输出,但它不起作用.
我在C#程序中有以下正则表达式,并且难以理解它:
(?<=#)[^#]+(?=#)
Run Code Online (Sandbox Code Playgroud)
我会把它分解为我认为我理解的内容:
(?<=#) a group, matching a hash. what's `?<=`?
[^#]+ one or more non-hashes (used to achieve non-greediness)
(?=#) another group, matching a hash. what's the `?=`?
Run Code Online (Sandbox Code Playgroud)
所以这个问题我已经是?<=
和?<
组成部分.从阅读MSDN,?<name>
用于命名组,但在这种情况下,尖括号永远不会关闭.
我?=
在文档中找不到,搜索它真的很难,因为搜索引擎大多会忽略那些特殊的字符.
例如,在本文中:
Lorem ipsum dolor坐下来,精致的adipistur elit.Nunc eu tellus vel nunc pretium lacinia.Proin sed lorem.Cras sed ipsum.Nunc a libero quis risus sollicitudin imperdiet.
我想在'ipsum'之后匹配这个词.
在Mastering Perl的"高级正则表达式"一章中,我有一个简单的例子,我无法找到一个很好的解决方案.这个例子可能是为了自己的利益而过于聪明,但也许有人可以为我解决它.可能有一本书的免费副本用于工作修复.:)
在讨论lookarounds的部分中,我想使用负向lookbehind来实现具有小数部分的数字的通用例程.关键是要使用负面的后视,因为那是主题.
我愚蠢地这样做了:
$_ = '$1234.5678';
s/(?<!\.\d)(?<=\d)(?=(?:\d\d\d)+\b)/,/g; # $1,234.5678
Run Code Online (Sandbox Code Playgroud)
该(?<!\.\d)
断言之前,该位(?=(?:\d\d\d)+\b)
是不是小数点和一个数字.
愚蠢的事情并不是在努力打破它.通过在末尾添加另一个数字,现在有一组三个数字,前面没有小数点和数字:
$_ = '$1234.56789';
s/(?<!\.\d)(?<=\d)(?=(?:\d\d\d)+\b)/,/g; # $1,234.56,789
Run Code Online (Sandbox Code Playgroud)
如果在Perl中lookbehinds可以是可变宽度,那么这将非常简单.但他们不能.
请注意,这样做很容易,没有负面的后观,但这不是示例的重点.有没有办法挽救这个例子?
我收到此错误:
java.util.regex.PatternSyntaxException: Look-behind group does not have an
obvious maximum length near index 22
([a-z])(?!.*\1)(?<!\1.+)([a-z])(?!.*\2)(?<!\2.+)(.)(\3)(.)(\5)
^
Run Code Online (Sandbox Code Playgroud)
我想要匹配COFFEE
,但不是BOBBEE
.
我正在使用java 1.6.
有没有办法在VBA正则表达式中做出消极和积极的观察?
如果字符串以"A"开头,我想不匹配,所以我当前在模式的开头做^ A,然后删除match(0)的第一个字符.显然不是最好的方法!
我正在使用regExp对象.