我正在使用以下模式:
(?<=<)(?<!>).*?q.*?(?!<)(?=>)
Run Code Online (Sandbox Code Playgroud)
它使用正面和负面的前瞻和后视来匹配q包含在匹配括号中的文字。
std::regex不支持后视。那么什么是好的选择呢?
我喜欢%r<…>定界符,因为它使查找正则表达式的开始和结束变得非常容易,而且我也不必转义任何内容/。但是,它们似乎有其他定界符没有的无法克服的限制?
可以想象的所有其他定界符都可以正常工作:
/(?<!foo)/
%r{(?<!foo)}
%r[(?<!foo)]
%r|(?<!foo)|
%r/(?<!foo)/
Run Code Online (Sandbox Code Playgroud)
但是当我尝试这样做时:
%r<(?<!foo)>
Run Code Online (Sandbox Code Playgroud)
它给出以下语法错误:
unterminated regexp meets end of file
Run Code Online (Sandbox Code Playgroud)
好吧,这可能不一样,它不是一个平衡的对,但是你怎么逃避它,使得它不喜欢吗?
是否需要逃脱?
任何单个非字母数字字符都可以用作分隔符
%[including these], %?or these?, %~or even these things~。通过使用这种表示法,通常的字符串定界符“和”可以出现在未转义的字符串中,但是当然您必须转义选择的新定界符。
实际上,在以下示例中需要转义:
%r!(?<\!foo)!
%r?(\?<!foo)?
Run Code Online (Sandbox Code Playgroud)
但是,如果那是唯一的问题,那么我应该能够像这样逃脱它并使它起作用:
%r<(?\<!foo)>
Run Code Online (Sandbox Code Playgroud)
但这会产生此错误:
undefined group option: /(?\<!foo)/
Run Code Online (Sandbox Code Playgroud)
因此,也许逃避是没有必要/允许?wikibooks.org确实将以下情况%<pointy brackets>列为例外之一:
但是,如果使用
%(parentheses), %[square brackets], %{curly brackets}或%<pointy brackets>作为分隔符,然后那些相同的分隔符可以出现转义,因为它们中的字符串,只要在平衡 对
平衡对有问题吗?
只要您在Regexp中执行需要平衡对的操作即可,例如...
%r{(?<!foo{1})} # repetition quantifier
%r[(?<![foo])] # character class …Run Code Online (Sandbox Code Playgroud) 我刚刚更详细地了解了这两个概念.我一直对RegEx很好,似乎我从未见过需要这两个零宽度断言.
我很确定我错了,但我不明白为什么需要这些结构.考虑这个例子:
Match a 'q' which is not followed by a 'u'.
Run Code Online (Sandbox Code Playgroud)
将输入2个字符串:
Iraq
quit
Run Code Online (Sandbox Code Playgroud)
使用负向前瞻,正则表达式如下所示:
q(?!u)
Run Code Online (Sandbox Code Playgroud)
没有它,它看起来像这样:
q[^u]
Run Code Online (Sandbox Code Playgroud)
对于给定的输入,这两个正则表达式给出相同的结果(即匹配Iraq但不是quit)(用perl测试).同样的想法适用于lookbehinds.
我错过了一个关键特性,使这些断言比经典语法更有价值吗?
将n个字节的正向lookbehind插入(?<=\C{n})任意正则表达式的开头会有什么后果,特别是在用于替换操作时?
至少在PHP中,正则表达式匹配函数,preg_match并preg_match_all允许匹配在给定的字节偏移之后开始.在任何其他PCRE PHP函数中没有相应的功能 - 例如,您可以指定对替换次数的限制preg_replace,但不能指定那些替换的匹配必须在n个字节之后发生.
显然会有一些(让它们称之为微不足道)对性能和可读性产生影响,但是会有任何(非平凡的)影响,比如匹配变为不匹配(除非它们没有被n个字节偏移)或者替换变得格格不入?
一些例子:
/some expression/成为/(?<=\C{4})some expression/一个4字节的偏移量
/(this) has (groups)/i成为/(?<=\C{2})(this) has (groups)/i2字节的偏移量
据我所知,并且从我运行的有限测试中,添加这个lookbehind有效地模拟了这个偏移参数,并且不会混淆任何其他的lookbehinds,替换或其他控制模式; 但我也不是Regex的专家.
我试图通过将n字节lookbehind插入模式来确定是否有可能对构建替换/过滤器函数扩展产生影响.它应该像匹配函数的偏移参数一样工作 - 因此简单地运行表达式substr( $subject, $offset )将不会出于与其不相同的原因preg_match(最明显的是它会切断任何外观,^然后错误地匹配子字符串的开头,不是原来的字符串).
我正在尝试为此代码高尔夫挑战编写一个Perl 6正则表达式,该挑战用规则拆分字符串:
例如:
66667888 -> '66', '66, '7', '888'
19999999179 -> '1', '99', '99', '999', '1', '7', '9'
Run Code Online (Sandbox Code Playgroud)
我以为正则表达式m:g/(.)[$0$0<!$0>|$0?]/可以正常工作,但是在负前瞻中使用捕获似乎会破坏它,而且我不知道如何正确使用它。
根据我的使用方式,它会永远循环,抛出错误 Cannot resolve caller INTERPOLATE_ASSERTION或返回错误的结果。有没有适当的方法可以提前使用捕获,或者这是一个错误?
我有先行断言(?=)的问题.例如,我有表达式:
/Win(?=2000)/
Run Code Online (Sandbox Code Playgroud)
它匹配Win,如果表达式是Win2000,Win2000fgF.我有下一个表达式:
^(?=.*\d)(?=.*[a-z]).*$
Run Code Online (Sandbox Code Playgroud)
它匹配数字和小写字母,例如:45dF,4Dd.但我不知道,为什么它的工作和匹配所有字符:)我没有字符,这是以前(?=.*\d).我想,只有这个表达式应该有效:
^.\*(?=.*\d)(?=.*[a-z]).*$
Run Code Online (Sandbox Code Playgroud)
(\*在表达之前).
你能解释一下吗?
我在正则表达式中嵌套的'+'/' - 'lookahead/lookbehind有问题.
假设我想改变'*'一个字符串,'%'让我们说它'\'逃脱了下一个字符.(将正则表达式转换为sql,如命令^^).
所以字符串
'*test*'应改为'%test%','\\*test\\*'- > '\\%test\\%',但是'\*test\*'并'\\\*test\\\*'应保持不变.我试过了:
(?<!\\)(?=\\\\)*\* but this doesn't work
(?<!\\)((?=\\\\)*\*) ...
(?<!\\(?=\\\\)*)\* ...
(?=(?<!\\)(?=\\\\)*)\* ...
Run Code Online (Sandbox Code Playgroud)
在上面给出的例子中,正确的正则表达式与'*'相匹配是什么?
是什么区别(?<!\\(?=\\\\)*)\*和(?=(?<!\\)(?=\\\\)*)\*,或者如果这些人基本上是错误的有这样的可视化构造正则表达式的区别?
我正在尝试编写一个sed脚本,它将捕获文本文件中的所有"裸"URL并将其替换为<a href=[URL]>[URL]</a>."裸"是指未包含在锚标记内的URL.
我最初的想法是,我应该匹配在他们面前没有"或"的URL,并且在他们之后也没有<或a".然而,我在表达"不要在前面或后面"的概念时遇到了困难,因为据我所知,sed没有前瞻或后视.
样本输入:
[Beginning of File]http://foo.bar arbitrary text
http://test.com other text
<a href="http://foobar.com">http://foobar.com</a>
Nearing end of file!!! http://yahoo.com[End of File]
Run Code Online (Sandbox Code Playgroud)
样本期望输出:
[Beginning of File]<a href="http://foo.bar">http://foo.bar</a> arbitrary text
<a href="http://test.com">http://test.com</a> other text
<a href="http://foo.bar">http://foo.bar</a>
Nearing end of file!!! <a href="http://yahoo.com">http://yahoo.com</a>[End of File]
Run Code Online (Sandbox Code Playgroud)
注意第三行未经修改,因为它已经在里面<a href>.另一方面,第一行和第二行都被修改.最后,请注意所有非URL文本都是未修改的.
最终,我想做的事情如下:
sed s/[^>"](http:\/\/[^\s]\+)/<a href="\1">\1<\/a>/g 2-7-2013
Run Code Online (Sandbox Code Playgroud)
我首先验证以下内容是否正确匹配并删除了一个URL:
sed 's/http:\/\/[^\s]\+//g'
Run Code Online (Sandbox Code Playgroud)
然后我尝试了这个,但它无法匹配从文件/输入开头开始的URL:
sed 's/[^\>"]http:\/\/[^\s]\+//g'
Run Code Online (Sandbox Code Playgroud)
有没有办法在sed中解决这个问题,可以通过模拟lookbehind/lookahead,还是明确匹配文件的开头和文件结尾?
我尝试列出目录中不以"Camera1"开头的所有文件,但以".png"结尾.为此,我在R中的list.files中使用正则表达式.要排除"Camera1",我尝试使用否定前瞻,但它不起作用.我的错误在哪里?;)
list.files(pathToDirectory, pattern = "^(?!Camera1).*\\.png")
Run Code Online (Sandbox Code Playgroud)
我收到错误:invalid 'pattern' regular expression
提前谢谢:)
我需要修改以下javascript正则表达式,因为它中的负面lookbehind在firefox中引发错误:
content = content.replace(/(?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>)/g, '„$1“');
Run Code Online (Sandbox Code Playgroud)
有没有人有想法可以帮助我?
提前致谢!