最近的许多正则表达式问题在查询中都有某种环视元素,对我来说并不是匹配成功所必需的.是否有一些教学资源正在推广它们?我试图找出哪种情况下你会更好地使用积极的前瞻/后退.我可以看到的主要应用是在尝试不匹配元素时.但是,例如,来自最近问题的这个查询有一个简单的解决方案来捕获.*,但为什么要使用后面的外观?
(?<=<td><a href="\/xxx\.html\?n=[0-9]{0, 5}">).*(?=<\/a><span
Run Code Online (Sandbox Code Playgroud)
而这个来自另一个问题:
$url = "www.example.com/id/1234";
preg_match("/\d+(?<=id\/[\d])/",$url,$matches);
Run Code Online (Sandbox Code Playgroud)
什么时候使用积极的环顾四周真的更好?你能举一些例子吗?
我意识到这与基于意见的问题接近,但我认为答案真的很有启发性.正则表达式令人困惑,没有让事情变得更复杂......我已经阅读了这个页面,并且对于何时使用它们而不是它们如何工作的一些简单指南更感兴趣.
感谢所有的答复.除了以下那些,我建议在这里查看m.buettner的好答案.
请注意,这个问题是在Julia的背景下,因此(据我所知)是PCRE.
假设你有一个像这样的字符串:
"sssppaaasspaapppssss"
Run Code Online (Sandbox Code Playgroud)
并且你想单独匹配字符串末尾的重复字符(在我们的字符串的情况下,四个"s"字符 - 也就是说,matchall给出["s","s","s" ","s"],而不是["ssss"]).这很简单:
r"(.)(?=\1*$)"
Run Code Online (Sandbox Code Playgroud)
它实际上是微不足道的(并且很容易使用 - replace(r"(.)(?=\1*$)","hell","k")会给予"hekk"同时replace(r"(.)(?=\1*$)","hello","k")给予"hellk").并且可以通过将点切换为更复杂的点来重复模式:
r"(\S+)(?=( \1)*$)"
Run Code Online (Sandbox Code Playgroud)
例如,它将独立匹配"abc"的最后三个实例"abc abc defg abc h abc abc abc".
然后导致问题...如何匹配字符串开头的重复字符或模式,而不是?具体来说,以上面使用的方式使用正则表达式.
显而易见的方法是将上述正则表达式的方向反转为r"(?<=^\1*)(.)"- 但PCRE/Julia不允许lookbehinds具有可变长度(除非它是固定变量,例如(?<=ab|cde)),因此会抛出错误.下一个想法是使用"\ K"作为某些东西r"^\1*\K(.)",但这只能匹配第一个字符(可能是因为它匹配后"前进",不再匹配插入符号).
为清楚起见:我正在寻找一个正则表达式,例如,导致
replace("abc abc defg abc h abc abc abc",<regex here>,"hello")
Run Code Online (Sandbox Code Playgroud)
生产
"hello hello defg abc h abc abc abc"
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,它从一开始用"你好"替换每个"abc",但直到第一次不匹配.我在上面提供的反向链接在字符串的另一端执行此操作:
replace("abc abc defg abc h abc abc abc",r"(\S+)(?=( \1)*$)","hello")
Run Code Online (Sandbox Code Playgroud)
产生
"abc abc defg abc h hello hello hello"
Run Code Online (Sandbox Code Playgroud) 如何将下一个搜索位置的开头倒数1?例如,假设我想匹配之间的所有数字#.以下将只给我奇数.
my $data="#1#2#3#4#";
while ( $data =~ /#(\d)#/g ) {
print $1, "\n";
}
Run Code Online (Sandbox Code Playgroud)
但是如果我能够将下一个位置的开始倒数1,我会得到偶数和奇数.
这不起作用: pos() = pos() - 1;
我知道我可以用它完成这个任务split.但这不能回答我的问题.
for (split /#/, $data) {
print $_, "\n";
}
Run Code Online (Sandbox Code Playgroud) 我想从一个字符串中删除所有字符除外#,@,:),:(。例:
this is, a placeholder text. I wanna remove symbols like ! and ? but keep @ & # & :)
Run Code Online (Sandbox Code Playgroud)
应导致(删除匹配的结果之后):
this is a placeholder text I wanna remove symbols like and but keep @ # :)
Run Code Online (Sandbox Code Playgroud)
我试过了:
(?! |#|@|:\)|:\()\W
Run Code Online (Sandbox Code Playgroud)
这是工作,但在的情况下,:)和:(,:仍然被匹配。我知道它是匹配的,因为它会检查每个字符和前面的字符,例如::)仅匹配:但:))匹配:)。
如何在前瞻断言中使用捕获组?
这段代码:
say "ab" ~~ m/(a) <?before (b) > /;
Run Code Online (Sandbox Code Playgroud)
返回:
?a?
0 => ?a?
Run Code Online (Sandbox Code Playgroud)
但我期待也能捕获'b'。
有没有办法这样做?
我不想将 'b' 留在前瞻之外,因为我不想让 'b' 成为比赛的一部分。
有没有办法捕获“b”但仍将其留在比赛之外?
笔记:
我尝试使用 Raku 的捕获标记,如下所示:
say "ab" ~~ m/<((a))> (b) /;
?a?
0 => ?a?
1 => ?b?
Run Code Online (Sandbox Code Playgroud)
但这似乎并没有像我期望的那样工作,因为即使 'b' 被留在比赛之外,正则表达式已经处理了'b'。而且我也不想被处理。
例如:
say 'abab' ~~ m:g/(a)<?before b>|b/;
(?a?
0 => ?a?
?b?
?a?
0 => ?a?
?b?)
# Four matches (what I want)
say 'abab' ~~ m:g/<((a))>b|b/;
(?a?
0 => ?a?
?a?
0 => ?a?)
# …Run Code Online (Sandbox Code Playgroud) JavaScript 是否支持正面和/或负面的前瞻/后视?它们的哪些组合?或者,更具体地说:
PCRE正则表达式/..(?<=(.)\1)/无法编译:"在后观断言中不允许使用子模式引用." 有趣的是,它似乎在前瞻中是可以接受的,例如/(?=(.)\1)../,不是在后视镜中.
是否存在技术上的原因,为什么特别是在后视镜中不允许反向引用?
如果有人问这个问题并且有答案,我很抱歉,但我找不到它。
我了解正则表达式环视和负向前瞻性。
问题是,负向先行检查字符串中当前位置之后的内容。
我需要的是查找并丢弃匹配项,如果字符串包含“职业”和“特殊”等单词,但如果它在字符串中的任何位置包含它们。
这样做的有效方法是什么?
目前我正在使用 PCRE 风格,但正则表达式越通用越好。
谢谢。
我正在研究VS Code中的语法扩展,而且我在查看正则表达式模式时遇到了困难.给定以下字符串,我想只返回cmp,前面是@fmt(
@fmt(cmp,foo)
Run Code Online (Sandbox Code Playgroud)
我在另一个编辑器中使用的匹配字符串是这样的:
(?<=[@|©](fmt)\()(\w+)
Run Code Online (Sandbox Code Playgroud)
但是,这在VS Code中不起作用,当我进行正则表达式搜索时,它会返回错误,表明它不是有效的表达式.玩弄它,问题是<=字符,表明背后的外观.
搜索VS Code网站不会返回任何类型的正则表达式参考指南.搜索Stack Overflow提出了这个问题,该问题表明Visual Studio具有唯一的正则表达式定义.不幸的是,该问题中给出的示例在VS Code中不起作用.
有谁知道如何看看VS Code中的正则表达式?或者至少知道VS Code的正则表达式文档在哪里?
我担心这是不可能的,因为根据Stack Overflow参考,JavaScript中不支持后面的内容.还有一个问题显示了如何模仿JavaScript函数中的后台,但我不知道是否可以使用用户定义的函数扩展VS Code中的语言.如果有人知道如何做到这一点,并且可以指向我这个方向,那也是一种可接受的解决方法.
regex regex-lookarounds visual-studio-code vscode-extensions
基于为乐的文档上环视断言,我读的正则表达式/ <?[abc]> <alpha> /的话说,“从左边,比赛开始,但不不消耗一个字符是a,b或c和,一旦你找到了一个匹配,匹配和使用一个字母字符。 ”
因此,这个输出是有道理的:
'abc' ~~ / <?[abc]> <alpha> / # OUTPUT: «?a?? alpha => ?a?»
Run Code Online (Sandbox Code Playgroud)
尽管该正则表达式有两个单字符术语,但其中一个没有捕获,因此我们的总捕获只有一个字符长。
但下一个表达让我感到困惑:
'abc' ~~ / <?[abc\s]> <alpha> / # OUTPUT: «?ab?? alpha => ?b?»
Run Code Online (Sandbox Code Playgroud)
现在,我们的总捕获长度为两个字符,其中之一未被<alpha>. 那么环视到底是不是捕捉到了一些东西?还是我对环视的工作方式有其他误解?
regex ×9
pcre ×2
raku ×2
rakudo ×2
javascript ×1
julia ×1
lookaround ×1
lookbehind ×1
perl ×1
python ×1
regex-group ×1
string ×1