Raku 的正则表达式预计将匹配最长的令牌。
事实上,在这段代码中可以看到这种行为:
raku -e "'AA' ~~ m/A {say 1}|AA {say 2}/"
# 2
Run Code Online (Sandbox Code Playgroud)
但是,当文本在变量中时,它的工作方式似乎不同:
raku -e "my $a = 'A'; my $b = 'AA'; 'AA' ~~ m/$a {say 1}|$b {say 2}/"
# 1
Run Code Online (Sandbox Code Playgroud)
为什么他们以不同的方式工作?有没有办法使用变量并仍然匹配最长的令牌?
试图为罗马数字编写正则表达式匹配器.在sed中(我认为它被认为是正则表达式的"标准"),如果你有多个由交替运算符分隔的选项,它将匹配最长的.即,"I|II|III|IV"将"IV"与"IV"匹配,将"III"与"III"匹配
在Java中,相同的模式匹配"I"代表"IV"而"I"代表"III".从左到右,交替匹配之间的Java选择; 也就是说,因为"I"出现在正则表达式中的"III"之前,所以它匹配.如果我将正则表达式更改为"IV|III|II|I",则行为会得到纠正,但这显然不是一般的解决方案.
有没有办法让Java从一个交替组中选择最长的匹配,而不是选择"第一个"?
为清晰起见,代码示例:
public static void main(String[] args)
{
Pattern p = Pattern.compile("six|sixty");
Matcher m = p.matcher("The year was nineteen sixty five.");
if (m.find())
{
System.out.println(m.group());
}
else
{
System.out.println("wtf?");
}
}
Run Code Online (Sandbox Code Playgroud)
这输出 "six"
似乎使用一个字符类比一个例子中的交替更快,比如:
[abc]vs (a|b|c)
我听说它被推荐,并且使用Time::HiRes我验证的简单测试(慢10倍).在捕获括号产生差异的情况下
也使用(?:a|b|c)不会改变结果.
但我不明白为什么.我认为这是因为回溯,但我在每个位置看到它的方式有3个字符比较所以我不确定回溯是如何影响交替的.这是实施交替性质的结果吗?
我使用Python Regex遇到了一个小问题.
假设这是输入:
(zyx)bc
Run Code Online (Sandbox Code Playgroud)
我想要实现的是获得括号中的任何内容作为单个匹配,以及任何外部的char作为单独的匹配.期望的结果将是:
['zyx','b','c']
Run Code Online (Sandbox Code Playgroud)
应保持比赛顺序.
我试过用Python 3.3获得这个,但似乎无法弄清楚正确的正则表达式.到目前为止,我有:
matches = findall(r'\((.*?)\)|\w', '(zyx)bc')
Run Code Online (Sandbox Code Playgroud)
print(matches) 产生以下结果:
['zyx','','']
Run Code Online (Sandbox Code Playgroud)
我有什么想法我做错了吗?
使用 perl(以及几乎所有正则表达式),每个组都按顺序编号。
例如,这段代码:
'bar' =~ m/(foo)|(bar)/;
print $1 // 'x'; # (1-based index)
print $2 // 'x'; # (1-based index)
Run Code Online (Sandbox Code Playgroud)
印刷 xbar
但是,对于 Raku,它的行为就像有一个分支重置组包裹了整个正则表达式:
'bar' ~~ m/(foo)|(bar)/;
print $0 // 'x'; # (0-based index)
print $1 // 'x'; # (0-based index)
Run Code Online (Sandbox Code Playgroud)
印刷 barx
我对这种行为没意见:)。然而,有时知道哪个组在交替下被捕获是有用的。
怎么知道有raku的组?
是(a|b)*一样的a*|b*吗?换句话说,(a|b)*接受字符串是as和bs的组合吗?
我设置了一个复杂的正则表达式来从一页文本中提取数据.由于某种原因,交替的顺序不是我所期望的.一个简单的例子是:
((13th|(Executive |Residential)|((\w+) ){1,3})Floor)
Run Code Online (Sandbox Code Playgroud)
简单地说,我试图得到一个楼层号码,一个已知的命名楼层,作为备份,我捕获1-3个不知名的单词后跟楼层,以防以后再查看(我实际上使用组名来识别这个但不想混淆这个问题)
问题是如果字符串是
on the 13th Floor
Run Code Online (Sandbox Code Playgroud)
我不明白13th Floor我on the 13th Floor似乎表明它与第3次交替匹配.我原以为它会匹配13楼.我特意设置了这个(或者我认为),优先考虑匹配的类型,只有当其他人错过时,才会将模糊的匹配留给最后.当他们说Regex贪婪时,我猜他们并不是在开玩笑,但我不清楚如何将其设置为"贪婪"并按照我想要的方式行事.
我使用的是ruby 2.1,但同样的东西可以在rubular网站上复制.
如果这是我的字符串:
????????????????
Run Code Online (Sandbox Code Playgroud)
我用这个表达式进行正则表达式匹配:
(?????????????|??)
Run Code Online (Sandbox Code Playgroud)
我期待得到更长的令牌作为匹配.
?????????????
Run Code Online (Sandbox Code Playgroud)
相反,我得到第二次替换作为匹配.
据我所知,它不像中文字符那样工作.
如果这是我的字符串:
foobar
Run Code Online (Sandbox Code Playgroud)
我使用这个正则表达式:
(foobar|foo)
Run Code Online (Sandbox Code Playgroud)
返回匹配结果是foobar.如果顺序是另一种方式,那么匹配的字符串就是foo.这对我来说很有意义.
regex ×8
raku ×2
rakudo ×2
alternation ×1
java ×1
performance ×1
perl ×1
python ×1
regex-group ×1
ruby ×1
string ×1