匹配ini属性的值

时间:2011-02-21 21:26:11

标签: javascript regex ini

previous question中,我询问了如何匹配ini值的一部分属性。 我得到了回答,并且前瞻性很好。

现在,我正在尝试获取属性的值:(编辑

foo.bar.far.boo = value

foo.bar.far.boo = value "something"

foo.bar.far.boo = "something" value "something"

foo.bar.far.boo = value ; some comments

开始修改

我想匹配“值”(粗体)。

任何未引用的单词后跟与否,先于或不出现任何其他字符串(引用)且仅在=(值部分)之后

结束修改

所以我尝试使用“积极的lookbehind”(?<==\s)\w+,但它在javascript中不存在。

关于如何实现这一目标的任何想法?

顺便说一句,我无法使用值来反转字符串,因为我无法访问它,我需要返回一个正则表达式才能匹配,这是我唯一可以做的事情。

开始修改

我无法使用该值,因为我无法访问它。我正在为脚本创建一个插件,我只能这样做:

return /myregex/;

无法访问实际值。

结束修改

2 个答案:

答案 0 :(得分:1)

编辑 - 如果PCRE与Perl 5.10兼容,则可以使用:
/=\s*(?:".*?"\s*)*\K\w+/

您是否尝试过/(?==\s*(?:".*?"\s*)*(\w+))/? 捕获机制应该只获取前瞻中的value(),但我不确定JS。

Perl:

use strict;
use warnings;

my @ary = (

'foo.bar.far.boo = value1',
'foo.bar.far.boo = value2 "something"',
'foo.bar.far.boo = "something" value3 "something"',
'foo.bar.far.boo = value4 ; some comments',
'foo.bar.far.boo = ; some comments value5'
);

for (@ary) {
#    if ( /(?==\s*(?:".*?"\s*)*(\w+))/ ) {
#        print "'$1'\n";
# or, >= Perl 5.10 ...
    if ( /=\s*(?:".*?"\s*)*\K\w+/ ) {
        print "'$&'\n";
    }
}

'value1'
'value2'
'value3'
'value4'

答案 1 :(得分:1)

修改 - 修改,

我想我只是提前看到了一个令人满意的答案。条件是如果ini行是正确的形式,它将取代并返回匹配变量中的单个值。很难让它失败。但是,''的返回可能表示该值未通过表单,它已通过表单但仍然是合法''。无论哪种方式,正则表达式都会考虑失败条件并返回'',因为这是有道理的。

以下是同一事物的两种变体:

# Variation 1: first 'value [value [value [value ...]]]'
/^(?!.*=)|(?:(?==\s*(?:;|(?:\W*"[^"]*"\W*)*$))|\b(?:\w+\s*)+\b(?:(?=\s*;.*$)|(?=\s*(?:[^"=]*"[^"]*"[^"]*)*$)))/

# Variation 2: first 'value'
/^(?!.*=)|(?:(?==\s*(?:;|(?:\W*"[^"]*"\W*)*$))|\b\w+\b(?:(?=\s*;.*$)|(?=\s*(?:[^"=]*"[^"]*"[^"]*)*$)))/

Perl代码测试用例:

use strict;
use warnings;

my @ary = (
'foo.bar.far.boo =  value0  ',
'foo.bar.far.boo = value10  ;  value11 ; more comments',
'foo.bar.far.boo = value2 "something2"',
'foo.bar.far.boo = value30 value31 "something32" value33 "something34"',
'foo.bar.far.boo = value4 ; some comments4',
'foo.bar.far.boo = ; some comments50 value51',
'foo.bar.far.boo = "something60" value61 "something62" value63 "something64"',
'foo.bar.far.boo    some comments70 value71',
'foo.bar.far.boo = ',
'foo.bar.far.boo = "junk90"  ,,  "junk91"',
);

for (@ary)
{
 if ( /
       ^ (?! .*=)
     |
       (?:
           (?= =\s*(?:;|(?:\W*"[^"]*"\W*)*$ ))
         |
            \b (?:\w+\s*)+ \b
            (?:
                (?= \s* ; .* $)
              | (?= \s* (?: [^"=]* "[^"]*" [^"]* )* $)
            )
        ) /x )
 {
    print "'$&'\n";
 }
}

输出:

'value0'
'value10'
'value2'
'value30 value31'
'value4'
''
'value61'
''
''
''