标签: regex-alternation

Raku 正则表达式:不一致的最长令牌匹配

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)

为什么他们以不同的方式工作?有没有办法使用变量并仍然匹配最长的令牌?

regex rakudo regex-alternation raku

14
推荐指数
1
解决办法
182
查看次数

Java正则表达式交替运算符"|" 行为似乎破裂了

试图为罗马数字编写正则表达式匹配器.在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"

java regex regex-alternation

12
推荐指数
1
解决办法
1万
查看次数

为什么字符类比交替更快?

似乎使用一个字符类比一个例子中的交替更快,比如:
[abc]vs (a|b|c)
我听说它被推荐,并且使用Time::HiRes我验证的简单测试(慢10倍).在捕获括号产生差异的情况下
也使用(?:a|b|c)不会改变结果.
但我不明白为什么.我认为这是因为回溯,但我在每个位置看到它的方式有3个字符比较所以我不确定回溯是如何影响交替的.这是实施交替性质的结果吗?

regex perl performance character-class regex-alternation

12
推荐指数
2
解决办法
1082
查看次数

使用交替运算符匹配多个正则表达式模式?

我使用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)

我有什么想法我做错了吗?

python regex regex-alternation

10
推荐指数
2
解决办法
5万
查看次数

Raku 正则表达式:如何知道哪个组被交替捕获

使用 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的组?

regex rakudo regex-group regex-alternation raku

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

(a | b)*与a*| b*相同吗?

(a|b)*一样的a*|b*吗?换句话说,(a|b)*接受字符串是as和bs的组合吗?

regex regex-alternation

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

正则表达式轮换命令

我设置了一个复杂的正则表达式来从一页文本中提取数据.由于某种原因,交替的顺序不是我所期望的.一个简单的例子是:

((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 Flooron the 13th Floor似乎表明它与第3次交替匹配.我原以为它会匹配13楼.我特意设置了这个(或者我认为),优先考虑匹配的类型,只有当其他人错过时,才会将模糊的匹配留给最后.当他们说Regex贪婪时,我猜他们并不是在开玩笑,但我不清楚如何将其设置为"贪婪"并按照我想要的方式行事.

regex regex-alternation

5
推荐指数
1
解决办法
1566
查看次数

为什么交替中的更长令牌不会匹配?

我使用的是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.这对我来说很有意义.

ruby regex string alternation regex-alternation

5
推荐指数
1
解决办法
264
查看次数