2013-01-14 31 views
0

我真的一直在努力尝试在单个正则表达式行中匹配一组相对简单的可能的字顺序。匹配不同的字顺序正则表达式

基本上,我想匹配这些(以及其他语法类似)的可能性:

“设置的VAR”

“设置了var关”

“设定VAR”

“设置VAR关”

“掀起了var”

由任何单一的 “设定于VAR”

“设置VAR”

“掀起VAR”

我唯一需要的基团是 “VAR”(其可以字)和,它将始终打开或关闭。这是基本的想法。

考虑到这一点,有两种可能的语法结构:

(on/off) (perhaps a word) (a word) 

(a word) (on/off) 

我已经能够独立使用以下正则表达式匹配这些可能性:

/((on |off)([a-z]{1,})? ([a-z]{2,}))/i 


/([a-z]{2,}) (on|off)/i 

所以,我想我可以这样做:

/(((on |off)([a-z]{1,})? ([a-z]{2,})))|(([a-z]{2,}) (on|off))/i 

这是(短语1)|(短语2),但短语二wi我们总是会与“出发”的思想相匹配,认为“集”是名字。我也试过:

/((?!set)) (((on |off)([a-z]{1,})? ([a-z]{2,})))|(([a-z]{2,}) (on|off))/i 

没有成功。


编辑1:另外,我忘了提及的是,这些短语可以在任何地方的文件中找到;他们不是独立的线路。

如: “这是设置了var上的方式” 是有可能的 “设置了var上


问题:

  1. 什么是我可以一起做到这一点的最佳方式,而无需 单独匹配?

  2. 有没有办法强制正则表达式OR语句的匹配顺序?

+0

您是否考虑限制用户输入?这种方式更容易。 '引发var'听起来像'var'是某种警报。 – JDB

+0

'/(?<= SET)(on | off)? (下)? ([a-z] +)((1)|(on | off))/' – FrankieTheKneeMan

回答

2

'的' 可以总是出现 '变种' 之前:

((the)? var) 

'设置' 总是从表达: '接通'

^set 

和 '关断' 是相互排斥,但需要:

(on|off) 

'var'和'on'/'off'以无特定顺序依次出现。现在一起:

^set ((the)? var (on|off)|(on|off) (the)? var)$ 

注意:我是一个.NET开发人员。正则表达式是非常标准的,上面的应该可以工作,但是可能有一种更有效的方法来在Perl中编写它。

+0

很好的解释 - 谢谢!我需要改变空间的位置(在没有THE的情况下,有两个空格可以匹配),但除此之外,这很好,谢谢! –

0

每当您尝试匹配复杂的数据时,您应该尝试创建一个语法。 Perl正则表达式允许您通过(?(DEFINE)...)指定递归语法。

use strict; use warnings; use feature 'say'; 
my $grammar = qr(
    set \s+ (?:the \s+)? (?<variable>(?&VAR)) \s+ (?:to \s+)? (?<value>(?&VAL)) 
    | set \s+ (?<value>(?&VAL)) \s+ (?:the \s+)? (?<variable>(?&VAR)) 

    (?(DEFINE) 
    (?<VAL> on | off) # edit only here to add new values 
    (?<VAR> (?!the|(?&VAL)) \w+) 
) 
)x; # /x -- whitespace is irrelevant 

while(<>){ 
    if (/$grammar/) { say "> val: $+{value} var: $+{variable}" } 
    else   { say "> no match" } 
} 

语法说明:(?&rule)调用命名规则。 (?<name>pattern)命名捕获,允许通过%+散列访问。也用于声明(DEFINE)块中的规则。

举例会议:

set the switch to off! 
> val: off var: switch 
I would like to set something on fire... 
> val: on var: something 
set on the set! 
> val: on var: set 
set on the set off something 
> val: on var: set 
set on off 
> no match 

请注意,我做了语法通过声明一个变量不匹配值,以及相当明确的。但是,上述示例确实显示了一些可能未被解析的有趣案例。

要在正则表达式中编写文法的更强大的方法,请看Regexp::Grammars

相关问题