在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/;
无法访问实际值。
结束修改
答案 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'
''
''
''