Как сопоставить поле в середине или конце строки с разделителями?

Извините за это название, я не знаю, как объяснить мою проблему в одном предложении.

Я пытаюсь сопоставить поле в журнале, но я не знаю, находится ли оно в середине строки или в конце.

Пример с тремя строками:

B=this is a short sentence C=see you soon A=hello world
C=see you soon B=this is a short sentence A=hello world
A=hello world B=this is a short sentence C=see you soon

Я хотел бы получить значение поля "C" (до скорой встречи). Моя проблема - последняя строка, так как в конце строки нет разделителя.

Это то, что я пытался.

Этот не соответствует последней строке, так как это последнее поле:

C=([^=]+) \w+=

Этот работает, но выглядит слишком сложным:

C=([^=]+)(?: \w+=|$)

Как бы вы это сделали?

2 ответа

Ну, я вижу потенциальное узкое место с самого начала: C= также будет соответствовать AC=таким образом, я бы использовал границу слова \b там.

Я не думаю, что вы действительно намереваетесь сопоставить часть следующего варианта, поэтому я бы использовал упреждающий просмотр, а не группу без захвата ((?: \w+=)).

\bC=(.+?)(?=$|\s+[A-Z]=)

Посмотреть демо

Вот, .+? будет соответствовать 1 или более символов до конца строки или 1 или более пробелов и заглавных букв A-Z письмо с последующим =,

В случае, если могут быть какие-либо буквы Unicode, вы можете заменить [A-Z] с \p{Lu},

Вы regex уже в порядке, я бы упростил начало:

C=.*?($|\n|(\w=))

Вы можете попробовать это здесь: https://regex101.com/r/oN8cS2/1

Другие вопросы по тегам