标签: regex-lookarounds

正则表达式负向前瞻

我正在做一些正规表达体操.我为自己设置了尝试搜索C#代码的任务,其中使用了as-operator而没有在合理的空间内进行空检查.现在我不想解析C#代码.例如,我想捕获诸如的代码片段

    var x1 = x as SimpleRes;
    var y1 = y as SimpleRes;
    if(x1.a == y1.a)
Run Code Online (Sandbox Code Playgroud)

但是,没有捕获

    var x1 = x as SimpleRes;
    var y1 = y as SimpleRes;
    if(x1 == null)
Run Code Online (Sandbox Code Playgroud)

也不是那件事

    var x1 = x as SimpleRes;
    var y1 = y as SimpleRes;
    if(somethingunrelated == null) {...}
    if(x1.a == y1.a)
Run Code Online (Sandbox Code Playgroud)

因此,任何随机的空检查都将被视为"良好检查",因此未被发现.

问题是:我如何匹配某些东西,同时确保在其周围环境中找不到其他东西.

我尝试过天真的方法,寻找'as'然后在150个字符内做一个负面的预测.

\bas\b.{1,150}(?!\b==\s*null\b)
Run Code Online (Sandbox Code Playgroud)

上述正则表达式与所有上述示例相匹配.我的直觉告诉我,问题是前瞻然后做负面预测会发现许多情况,即前瞻没有找到'== null'.

如果我尝试否定整个表达式,那么这也无济于事,因为这将匹配大多数C#代码.

regex negative-lookahead regex-lookarounds

7
推荐指数
1
解决办法
1247
查看次数

在Perl中使用*修饰符进行否定前瞻性断言

如果测试的字符串后跟任意数量的空格(零包括)然后没有跟随,我有(我相信的)负向前瞻断言 <@> *(?!QQQ),我期望匹配.<@>QQQ

但是,如果测试的字符串是<@> QQQ正则表达式匹配.

我不明白为什么会出现这种情况,并希望对此事有任何帮助.

这是一个测试脚本

use warnings;
use strict;

my @strings = ('something <@> QQQ',
               'something <@> RRR',
               'something <@>QQQ' ,
               'something <@>RRR' );


print "$_\n" for map {$_ . " --> " . rep($_) } (@strings);



sub rep {

  my $string = shift;

  $string  =~ s,<@> *(?!QQQ),at w/o ,;
  $string  =~ s,<@> *QQQ,at w/  QQQ,;

  return $string;
}
Run Code Online (Sandbox Code Playgroud)

这打印

something <@> QQQ --> something at w/o  QQQ
something <@> …
Run Code Online (Sandbox Code Playgroud)

regex perl negative-lookahead regex-lookarounds

7
推荐指数
2
解决办法
668
查看次数

正则表达式只捕获第一场比赛

我一直在谷歌上搜索堆栈溢出提供的推荐问题.但是,我没有找到答案.

我想用正则表达式解析一个字符串,字符串的例子是

Lot: He said: Thou shalt not pass!

我想Lot作为一个群体捕获,并且He said: Thou shalt not pass!.但是,当我使用我的(.+): (.+)模式时,它会返回

Lot: He said:Thou shalt not pass!

是否可以He said: Thou shalt not pass使用正则表达式捕获?

regex lookaround regex-lookarounds

7
推荐指数
2
解决办法
3万
查看次数

在正面观察后匹配所有特定角色

我整个早上一直试图让这个正则表达式正确,我已经撞到了墙上.在下面的字符串中,我不想匹配后面的每个正斜杠,.com/<first_word>除了URL / 之后的任何正斜杠.

$string = "http://example.com/foo/12/jacket Input/Output";
    match------------------------^--^
Run Code Online (Sandbox Code Playgroud)

斜杠之间的单词长度无关紧要.

正则表达式:(?<=.com\/\w)(\/)结果:

$string = "http://example.com/foo/12/jacket Input/Output"; // no match
$string = "http://example.com/f/12/jacket Input/Output";   
    matches--------------------^
Run Code Online (Sandbox Code Playgroud)

正则表达式:(?<=\/\w)(\/)结果:

$string = "http://example.com/foo/20/jacket Input/O/utput"; // misses the /'s in the URL
    matches----------------------------------------^
$string = "http://example.com/f/2/jacket Input/O/utput"; // don't want the match between Input/Output
    matches--------------------^-^--------------^                    
Run Code Online (Sandbox Code Playgroud)

因为lookbehind可以没有修饰符并且需要是一个零长度断言,我想知道我是否刚刚错误的路径并且应该寻找另一个正则表达式组合.

这种正面方式是正面的吗?或者我错过了大量咖啡以外的其他东西?

:标记PHP,因为正则表达式应该在工作的任何preg_*功能.

php regex regex-lookarounds

7
推荐指数
1
解决办法
242
查看次数

在Rust正则表达式中模拟lookbehind行为最明智的方法是什么?

Rust 正则表达式表明:

此crate提供了正则表达式的本机实现,它在语法和实现方面都基于RE2.值得注意的是,未提供反向引用和任意前瞻/后瞻断言.

在撰写本文时,"Rust regex lookbehind"回来后没有DuckDuckGo的结果.

我以前从来没有解决过这个问题,但我可以想到两种方法:

方法1(前进)

  1. 迭代.captures()我想用作lookbehind的模式.
  2. 匹配我想要在捕获之间匹配的东西.(向前)

方法2(反向)

  1. 匹配我真正想要匹配的模式.
  2. 对于每个匹配,查找lookbehind模式,直到上一次捕获的结束字节或字符串的开头.

这不仅是一个巨大的痛苦,似乎很多边缘案件都会让我感到震惊.有没有更好的方法来解决这个问题?

给出如下字符串:

"Fish33-Tiger2Hyena4-"

我想提取["33-", "2", "4-"]iff每个跟随一个字符串之类的"Fish".

regex rust regex-lookarounds

7
推荐指数
2
解决办法
1381
查看次数

python regex:命名组中的重复名称

有没有办法在python中使用regex命名组中的相同名称?例如(?P<n>foo)|(?P<n>bar).

使用案例:我试图捕获typeid使用此正则表达式:
/(?=videos)((?P<type>videos)/(?P<id>\d+))|(?P<type>\w+)/?(?P<v>v)?/?(?P<id>\d+)?
从此字符串:

  • /信道/ V/123
  • / CH/V/41500082
  • /渠道
  • /视频/ 41500082

现在我收到错误: redefinition of group name 'id' as group 6; was group 3

python regex regex-group regex-lookarounds

7
推荐指数
1
解决办法
2189
查看次数

外观和非捕获组之间的功能差异?

我试图想出一个例子,其中积极的环顾四周工作,但非捕获组将无法工作,以进一步了解他们的用法.这些例子我"米想出与非捕捉组作为一切工作的很好,所以我觉得我的" M没有完全把握正面看的使用周围.

这是一个字符串,(取自一个SO示例),在答案中使用正面向前看.用户想要获取第二列值,仅当第一列的值以ABC开头时,最后一列的值为"active".

string ='''ABC1    1.1.1.1    20151118    active
          ABC2    2.2.2.2    20151118    inactive
          xxx     x.x.x.x    xxxxxxxx    active'''
Run Code Online (Sandbox Code Playgroud)

给出的解决方案使用了'积极展望',但我注意到我可以使用非联合组来达到相同的答案.所以,我很难想出一个正面环顾无效的例子,非捕获组不起作用.

pattern =re.compile('ABC\w\s+(\S+)\s+(?=\S+\s+active)') #solution

pattern =re.compile('ABC\w\s+(\S+)\s+(?:\S+\s+active)') #solution w/out lookaround
Run Code Online (Sandbox Code Playgroud)

如果有人愿意提供一个例子,我将不胜感激.

谢谢.

python regex regex-group python-3.x regex-lookarounds

7
推荐指数
1
解决办法
409
查看次数

需要在java中将字符串拆分为两部分

我有一个字符串,其中包含一个连续的数字块,然后是一个连续的字符块.我需要将它们分成两部分(一个整数部分和一个字符串).

我尝试过使用String.split("\\D", 1),但它正在吞噬第一个角色.我检查了所有的String API,但没有找到合适的方法.

做这件事有什么方法吗?

java regex string lookaround regex-lookarounds

6
推荐指数
1
解决办法
7165
查看次数

提取可能多次出现或根本不出现的字符串元素

从URL的字符向量开始.我们的目标是与公司的唯一名称最终,只意味着一列"test","example""sample"在下面的例子.

urls <- c("http://grand.test.com/", "https://example.com/", 
          "http://.big.time.sample.com/")
Run Code Online (Sandbox Code Playgroud)

删除".com"可能跟随它的任何内容并保留第一部分:

urls <- sapply(strsplit(urls, split="(?<=.)(?=\\.com)", perl=T), "[", 1) 

urls
# [1] "http://grand.test"    "https://example"      "http://.big.time.sample"
Run Code Online (Sandbox Code Playgroud)

我的下一步是使用链式调用删除http://https://部分gsub():

urls <- gsub("^http://", "",  gsub("^https://", "", urls))

urls
# [1] "grand.test"       "example"          ".big.time.sample"
Run Code Online (Sandbox Code Playgroud)

但这是我需要帮助的地方.如何在第一个和第三个网址字符串中处理公司名称之前的多个句点(点)?例如,下面的调用返回第二个字符串的NA,因为该"example"字符串没有剩余句点.或者,如果我只保留第一部分,我会丢失公司名称.

urls  <- sapply(strsplit(urls, split = "\\."), "[", 2)
urls
# [1] "test" NA     "big"

urls  <- sapply(strsplit(urls, split = "\\."), "[", 1)
urls
# [1] "grand"   "example" ""  
Run Code Online (Sandbox Code Playgroud)

也许是一个 …

substring r strsplit regex-lookarounds

6
推荐指数
1
解决办法
1201
查看次数

捕获组的负向前瞻

我正在尝试这个挑战:

https://regex.alf.nu/4

我想匹配所有不包含ABBA模式的字符串.

比赛:

aesthophysiology
amphimictical
baruria
calomorphic
Run Code Online (Sandbox Code Playgroud)

不匹配

anallagmatic
bassarisk
chorioallantois
coccomyces
abba
Run Code Online (Sandbox Code Playgroud)

首先,我有一个正则表达式来确定ABBA模式.

(\w)(\w)\2\1
Run Code Online (Sandbox Code Playgroud)

接下来我想匹配不包含该模式的字符串:

^((?!(\w)(\w)\2\1).)*$
Run Code Online (Sandbox Code Playgroud)

然而,这符合一切.

如果我通过为负前瞻指定文字来简化这一点:

^((?!agm).)*$
Run Code Online (Sandbox Code Playgroud)

正则表达式与字符串"anallagmatic"不匹配,这是期望的行为.

因此看起来问题在于我在负向前瞻中使用捕获组和反向引用.

regex backreference regex-negation capturing-group regex-lookarounds

6
推荐指数
1
解决办法
3802
查看次数