Как извлечь отдельные части строки с помощью регулярного выражения - PullRequest
2 голосов
/ 08 мая 2020

Я пытаюсь создать регулярное выражение, которое может обрабатывать следующее:

  • ab c
  • ab c -def

где -def необязательна.

Я хочу получить группы захвата для «ab c» и необязательную часть «def».

Я пробовал это (в Javascript), но не могу понять необязательную часть:

/^(.*)+(-(.*))?$/

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

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Вы близки, попробуйте ?, чтобы выражение lazy .

/^(.*?)(-(.*))?$/
1 голос
/ 08 мая 2020

Вы можете попробовать /^([^-]+)(-(.*))?$/. Одна из проблем заключается в том, что первый + находится за пределами группы захвата, что означает, что он будет соответствовать только последнему символу. Во-вторых, .* является жадным и будет соответствовать -, пожирая его до конца строки.

Пример выполнения:

console.log("abc-def".match(/^([^-]*)(-(.*))?$/));
console.log("abc".match(/^([^-]*)(-(.*))?$/));

Возможно, вам не потребуется захватывать подстроку, начинающуюся с -, и в этом случае /^([^-]*)(?:-(.*))?$/ может работать.

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