Соответствует значению свойства ini - PullRequest
0 голосов
/ 22 февраля 2011

В предыдущем предыдущем вопросе я спросил, как сопоставить часть свойства ini-значению.Я получил ответ, и он отлично работает с положительным взглядом.

Теперь я пытаюсь получить значение свойства: ( edit )

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

начать редактирование

Я хочу соответствовать "значению" (жирным шрифтом).

Любое слово, которое не заключено в кавычки, сопровождается или нет, предшествует или не ставится какой-либо другой строкой (в кавычках) и только после = (часть значения)

end edit

Итак, я попытался использовать «позитивный взгляд назад» (?<==\s)\w+, но его нет в javascript.

Есть идеи о том, какдостигнуть этого?

Кстати, я не могу обработать значение, чтобы перевернуть строку, так как я не могу получить к ней доступ, мне нужно вернуть регулярное выражение для сопоставления, это единственное, что я могу сделать.

начать редактирование

Я не могу работать со значением, потому что у меня нет доступа к нему.Я создаю плагин для скрипта, и я могу сделать только что-то подобное:

return /myregex/;

, не имея доступа к фактическому значению.

end edit

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Правка - изменено,

Я думаю, что нашел удовлетворительный ответ, используя только взгляд в будущее.Условия: если строка 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*(?:[^"=]*"[^"]*"[^"]*)*$)))/

A Контрольный пример 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'
''
''
''

1 голос
/ 22 февраля 2011

Редактировать - Если PCRE совместим с Perl 5.10, это будет работать:
/=\s*(?:".*?"\s*)*\K\w+/

Вы пробовали /(?==\s*(?:".*?"\s*)*(\w+))/?
Механизм захвата должен захватывать только значение () в будущем, но я не уверен в 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'

...