Предотвращение регулярного выражения, пропускающего значение в середине - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь записать некоторые строковые значения в файл исходного кода, используя следующее регулярное выражение

[\s\"\']{1}([A-Za-z0-9\_\-]{1,})[\s\"\']{1}

для переменных, подобных этому:

var components = 'string_1 string_2 string_3';

Но регулярное выражение захватывает только string_1 и string_3 пропуск string_2

Я полагаю, это вызвано тем фактом, что при захвате значения string_1 регулярное выражение фактически обнаруживает 'string_1 (обратите внимание на ' и space) и string_3' (также обратите внимание на space и '), в результате чего string_2 не имеет ничего с обеих сторон, поэтому он не будет захвачен .

Как мне захватить все три значения.

Обратите внимание, что регулярное выражение должно захватывать следующий сценарий ios:

"string_1"
'string_1'
"string_1 string2"
'string_1 string2'
"string_1 string2 string3"

и так далее ...

Также ему не нужно совпадать

$string_1
#string_1$
string_1
//string_1
/*string_1
\string_1
!string_1

et c ...

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

Ответы [ 4 ]

1 голос
/ 29 марта 2020

Если ваш механизм регулярных выражений PCRE (PHP), можно использовать следующее регулярное выражение:

(?:\"|\G) *\K\w+(?=.*\")|(?:\'|\G) *\K\w+(?=.*\') 

Демо

Следующие операции выполняются regex engine:

(?:          # begin a non-capture group
  \"         # match double-quote
 |           # or
 \G          # continue from where last match ended
)            # end non-capture group
\ *          # match 0+ spaces
\K           # forget everything matched so far
\w+          # match 1+ word chars
(?=          # begin positive lookahead
  .*         # match 0+ chars in same line
  \"         # match double quote
)            # end positive lookahead
|            # or 
(?:\'|\G)    # as above except single rather than double quote
\ *\K\w+     # as above
(?=.*\')     # as above except single rather than double quote
0 голосов
/ 29 марта 2020

Немного другое выражение для разновидностей RegEx на основе PCRE, которое основывается на захвате разделителя, заранее проверяет, можно ли снова найти тот же разделитель после переменного числа разрешенных символов, и сопоставляет разрешенные слова только до тех пор, пока они следуют открывающий разделитель.

/(['"])(?=[\w ]+\1)\K\w+|\G \K\w+/g

\K используется для удаления символов, предшествующих ему, из возвращаемых строк соответствия.

См. regex demo .

0 голосов
/ 29 марта 2020

Как мне захватить все три значения.

Использование ([^\W]+) и от 1 до многих совпадений будет иметь каждый из элементов без пробелов.

В основном говорят, что соответствует чему-либо, что не в используемом наборе символов \w, используя ^ (не) \W (любые не символы) в этом наборе 1 для многих +.

0 голосов
/ 29 марта 2020

Попробуйте это: /(\b\w+?\b)+?/gm

Демонстрация: https://regex101.com/r/W5kD9S/5

Объяснение:

  • \b утверждение позиции на граница слова
  • \w соответствует любому символу слова (равному [a-zA-Z0-9_])
  • +? Соответствует от одного до неограниченного числа раз, как можно меньше раз, расширяясь по мере необходимости (ленивый)

Обновление:

Я обновил исходный вопрос, чтобы добавить немного больше деталей и пояснений. К сожалению, это тоже соответствует $ string_1 ...

Хорошо, тогда вы можете попробовать: ^(?:'|")(.*)?(?:'|")$

Демо: https://regex101.com/r/W5kD9S/4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...