Как сопоставить поле в середине или конце строки с разделителями?
Извините за это название, я не знаю, как объяснить мою проблему в одном предложении.
Я пытаюсь сопоставить поле в журнале, но я не знаю, находится ли оно в середине строки или в конце.
Пример с тремя строками:
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