标签: lookbehind

背后的反向引用

你能在后视镜中使用反向引用吗?

假设我想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(.)在这种情况下,因此具有有限的长度).

那么有没有办法在后视镜中使用反向引用?

如果没有,你可以使用这个嵌套的前瞻来解决它吗?还有其他常用技术吗?

java regex backreference lookbehind

11
推荐指数
1
解决办法
1861
查看次数

RegEx:Look-behind避免奇数个连续反斜杠

我有用户输入,方括号内允许一些标签.我已经编写了正则表达式模式来查找和验证括号内的内容.

在用户输入字段中,开启括号可以([)使用反斜杠进行转义,也可以使用另一个反斜杠(\)转义反斜杠.我需要后视子模式以避免在开括号之前奇数个连续的反斜杠.

目前我必须处理这样的事情:

(?<!\\)(?:\\\\)*\[(?<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

php regex pcre negative-lookbehind lookbehind

10
推荐指数
1
解决办法
1921
查看次数

使用Look-behind正则表达式(Ruby)的问题

我写了这个正则表达式来匹配HTML页面中的所有hrefsrc链接; (我知道我应该使用解析器;这只是试验):

/((href|src)\=\").*?\"/#没有后视

它工作正常,但当我尝试将表达式的第一部分修改为后视模式时:

/(?<=(href|src)\=\").*?\"/#带有后视

它会抛出一个错误,指出"无效的后视模式".任何想法,看起来有什么问题?

ruby regex lookbehind

10
推荐指数
1
解决办法
3153
查看次数

Python中的可变宽度Lookbehind问题

我有以下场景:

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*和"|"

我该怎么解决这个问题.

提前致谢!

python regex negative-lookahead lookbehind

10
推荐指数
1
解决办法
3761
查看次数

正则表达式后观问题

我用

(?<!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()函数

regex lookbehind

9
推荐指数
1
解决办法
2265
查看次数

嵌套的正则表达式前瞻和后瞻

我在正则表达式中嵌套的'+'/' - 'lookahead/lookbehind有问题.

假设我想改变'*'一个字符串,'%'让我们说它'\'逃脱了下一个字符.(将正则表达式转换为sql,如命令^^).

所以字符串

  • '*test*'应改为'%test%',
  • '\\*test\\*'- > '\\%test\\%',但是
  • '\*test\*''\\\*test\\\*'应保持不变.

我试过了:

(?<!\\)(?=\\\\)*\*      but this doesn't work
(?<!\\)((?=\\\\)*\*)    ...
(?<!\\(?=\\\\)*)\*      ...
(?=(?<!\\)(?=\\\\)*)\*  ...
Run Code Online (Sandbox Code Playgroud)

在上面给出的例子中,正确的正则表达式与'*'相匹配是什么?

是什么区别(?<!\\(?=\\\\)*)\*(?=(?<!\\)(?=\\\\)*)\*,或者如果这些人基本上是错误的有这样的可视化构造正则表达式的区别?

regex perl lookahead lookbehind regex-lookarounds

9
推荐指数
3
解决办法
4140
查看次数

正则表达式 - 结合正面和负面的外观

我在一些巨大的SSIS包中做了一些替换,以反映表名和列名的变化.

一些表格的列名与表名相同,我需要匹配列名而不匹配表名.

所以,我需要的是一种方式,以配合MyName[MyName],但不是在[dbo].[MyName]

(?<=\[)(MyName)(?=\])匹配两者,我认为这样(?<!\[dbo\]\.)(?<=\[)(MyName)(?=\])做会有所作为,但它似乎不起作用.

/ Smoller

regex lookbehind

8
推荐指数
1
解决办法
2668
查看次数

匹配字符串与正则表达式,只要它没有括号括起来

我希望匹配一个字符串"Order By XXX",其中XXX可以是任何字母,数字,句号,逗号,空格或方括号.但是,我只想匹配它,如果它没有括号括起来(一边的括号是好的,只要它不在两边).所以它应该与""中的斜体部分相匹配,因为它不应该匹配任何东西

应匹配(斜体匹配部分):

  • 从Y 顺序中选择X为z
  • 选择y =(按[ID] desc从C 顺序中选择前1个Z )

不应该匹配:

  • 从Y中选择X(按z排序)
  • 按ac选择aa,NTILE(4)OVER(按ab排序)组

我有正则表达式字符串用于按文本匹配顺序:[ ]*order by [\w,.\[\] ]+.但是,我在正确地进行前瞻/后期工作时遇到了一些麻烦.关于如何进行的任何建议?

c# regex lookahead lookbehind

8
推荐指数
1
解决办法
832
查看次数

带有通配符的正则表达式负向外观

我试图匹配一些文本,如果它附近没有另一个文本块.例如,"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中的无效正则表达式.我在想这个问题错了吗?

ruby regex lookbehind

8
推荐指数
1
解决办法
3180
查看次数

Raku 正则表达式:如何在lookbehinds 中使用捕获组

如何在后视断言中使用捕获组?

我尝试使用与此答案相同的公式。但这似乎不适用于后视。

从概念上讲,这就是我想要做的。

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中使用捕获组?

regex lookbehind rakudo raku

8
推荐指数
1
解决办法
126
查看次数