你能在后视镜中使用反向引用吗?
假设我想split在我身后的任何地方重复两次角色.
String REGEX1 = "(?<=(.)\\1)"; // DOESN'T WORK!
String REGEX2 = "(?<=(?=(.)\\1)..)"; // WORKS!
System.out.println(java.util.Arrays.toString(
"Bazooka killed the poor aardvark (yummy!)"
.split(REGEX2)
)); // prints "[Bazoo, ka kill, ed the poo, r aa, rdvark (yumm, y!)]"
Run Code Online (Sandbox Code Playgroud)
使用REGEX2(其中反向引用嵌套在lookbehind中的前瞻)可以工作,但REGEX1在运行时会出现此错误:
Look-behind group does not have an obvious maximum length near index 8
(?<=(.)\1)
^
Run Code Online (Sandbox Code Playgroud)
这个排序是有意义的,我想,因为在一般的反向引用可以捕捉任何长度的字符串(如果正则表达式编译器是有点聪明,但是,它可以判断\1是(.)在这种情况下,因此具有有限的长度).
那么有没有办法在后视镜中使用反向引用?
如果没有,你可以使用这个嵌套的前瞻来解决它吗?还有其他常用技术吗?
我有用户输入,方括号内允许一些标签.我已经编写了正则表达式模式来查找和验证括号内的内容.
在用户输入字段中,开启括号可以([)使用反斜杠进行转义,也可以使用另一个反斜杠(\)转义反斜杠.我需要后视子模式以避免在开括号之前奇数个连续的反斜杠.
目前我必须处理这样的事情:
(?<!\\)(?:\\\\)*\[(?<inside brackets>.*?)]
Run Code Online (Sandbox Code Playgroud)
它工作正常,但问题是这个代码仍然匹配括号前面可能的连续反斜杠对(即使它们是隐藏的),并且后面只检查是否有另外一个反斜杠附加到对(或直接到开括号) .如果可能的话,我需要在后视组内避免它们.
my [test] string is ok
my \[test] string is wrong
my \\[test] string is ok
my \\\[test] string is wrong
my \\\\[test] string is ok
my \\\\\[test] string is wrong
...
etc
Run Code Online (Sandbox Code Playgroud)
我使用PHP PCRE
我有以下场景:
1) car on the right shoulder
2) car on the left shoulder
3) car on the shoulder
Run Code Online (Sandbox Code Playgroud)
当左边没有时,我想匹配"肩膀".所以只有3)回归"肩膀"
re.compile(r'(?<!right|right\s*)shoulder')
sre_constants.error: look-behind requires fixed-width pattern
Run Code Online (Sandbox Code Playgroud)
好像我不能用\ s*和"|"
我该怎么解决这个问题.
提前致谢!
我用
(?<!value=\")##(.*)##
Run Code Online (Sandbox Code Playgroud)
匹配像## MyString ## 这样的字符串 ,它不是以下形式:
<input type="text" value="##MyString##">
Run Code Online (Sandbox Code Playgroud)
这适用于上述形式,但不适用于:(它仍匹配,不匹配)
<input type="text" value="Here is my ##MyString## coming..">
Run Code Online (Sandbox Code Playgroud)
我试过了:
(?<!value=\").*##(.*)##
Run Code Online (Sandbox Code Playgroud)
没有运气.任何建议都将深表感谢.
编辑:我正在使用PHP preg_match()函数
我在正则表达式中嵌套的'+'/' - 'lookahead/lookbehind有问题.
假设我想改变'*'一个字符串,'%'让我们说它'\'逃脱了下一个字符.(将正则表达式转换为sql,如命令^^).
所以字符串
'*test*'应改为'%test%','\\*test\\*'- > '\\%test\\%',但是'\*test\*'并'\\\*test\\\*'应保持不变.我试过了:
(?<!\\)(?=\\\\)*\* but this doesn't work
(?<!\\)((?=\\\\)*\*) ...
(?<!\\(?=\\\\)*)\* ...
(?=(?<!\\)(?=\\\\)*)\* ...
Run Code Online (Sandbox Code Playgroud)
在上面给出的例子中,正确的正则表达式与'*'相匹配是什么?
是什么区别(?<!\\(?=\\\\)*)\*和(?=(?<!\\)(?=\\\\)*)\*,或者如果这些人基本上是错误的有这样的可视化构造正则表达式的区别?
我在一些巨大的SSIS包中做了一些替换,以反映表名和列名的变化.
一些表格的列名与表名相同,我需要匹配列名而不匹配表名.
所以,我需要的是一种方式,以配合MyName中[MyName],但不是在[dbo].[MyName]
(?<=\[)(MyName)(?=\])匹配两者,我认为这样(?<!\[dbo\]\.)(?<=\[)(MyName)(?=\])做会有所作为,但它似乎不起作用.
/ Smoller
我希望匹配一个字符串"Order By XXX",其中XXX可以是任何字母,数字,句号,逗号,空格或方括号.但是,我只想匹配它,如果它没有括号括起来(一边的括号是好的,只要它不在两边).所以它应该与""中的斜体部分相匹配,因为它不应该匹配任何东西
应匹配(斜体匹配部分):
不应该匹配:
我有正则表达式字符串用于按文本匹配顺序:[ ]*order by [\w,.\[\] ]+.但是,我在正确地进行前瞻/后期工作时遇到了一些麻烦.关于如何进行的任何建议?
我试图匹配一些文本,如果它附近没有另一个文本块.例如,"bar"如果"foo"不在它之前,我想匹配.我可以匹配"bar"如果在此正则表达式中使用负面外观后"foo"不立即在它之前:
/(?<!foo)bar/
Run Code Online (Sandbox Code Playgroud)
但我也不喜欢"foo 12345 bar".我试过了:
/(?<!foo.{1,10})bar/
Run Code Online (Sandbox Code Playgroud)
但使用通配符+范围似乎是Ruby中的无效正则表达式.我在想这个问题错了吗?
如何在后视断言中使用捕获组?
我尝试使用与此答案相同的公式。但这似乎不适用于后视。
从概念上讲,这就是我想要做的。
say "133" ~~ m/ <?after $0+> (\d) $ /
Run Code Online (Sandbox Code Playgroud)
我知道这可以在没有后视的情况下轻松实现,但暂时忽略它:)
为此,我尝试使用以下选项:
使用:var语法:
say "133" ~~ m/ <?after $look-behind+> (\d):my $look-behind; $ /;
# Variable '$look-behind' is not declared
Run Code Online (Sandbox Code Playgroud)
使用code block定义外部变量的语法:
my $look-behind;
say "133" ~~ m/ <?after $look-behind+> (\d) {$look-behind=$0} $ /;
# False
Run Code Online (Sandbox Code Playgroud)
似乎问题是lookbehind在“代码块/:my $var”之前执行,因此该变量对于后视树是空的。
有没有办法在lookbehinds中使用捕获组?