#regex
#регулярное выражение
Вопрос:
В настоящее время у меня есть текстовые файлы, некоторая часть этих файлов похожа:
#:some comment
msgid ""
"CCCCC"
msgstr ""
#: some comment
msgid ""
"CCCCC"
"DDDDD"
msgstr ""
#:some comment
msgid ""
"CCCCC"
"DDDDD"
"EEEEE"
msgstr ""
И у меня есть регулярное msgid ""(([^n#])*(n )) msgstr ""
выражение, соответствующее всем этим строкам, кроме комментария.
Моя конечная цель — найти любые строки в msgid или после него и заменить их на msgstr
Нравится:
#:some comment
msgid ""
"CCCCC"
msgstr ""
"CCCCC"
#: some comment
msgid ""
"CCCCC"
"DDDDD"
msgstr ""
"CCCCC"
"DDDDD"
#:some comment
msgid ""
"CCCCC"
"DDDDD"
"EEEEE"
msgstr ""
"CCCCC"
"DDDDD"
"EEEEE"
Поэтому, когда вы используете поиск и замену в регулярном выражении, $ 1 соответствует только последней строке каждой группы. Я надеялся, что $ 1 может соответствовать строкам между msgid и msgstr, чтобы его можно было заменить после msgstr.
Любое предложение будет очень полезно!
Комментарии:
1. попробуйте добавить все строки в одну строку (в случае java) и сопоставить регулярное выражение, чтобы извлечь все совпадения в этой строке.
2. Какое регулярное выражение вы используете? В чем вы их используете (perl, sed, awk, javascript)? Хотите добавить несколько соответствующих тегов?
Ответ №1:
Вот демонстратор sed sed -En ":a;N;$!ba;s/msgid ""((([^n#])*(n )) )msgstr ""/--1--/g;l"
. Не зная больше о вашей среде, я выбрал это для тестирования.
Вам не нужен sed, это просто для того, чтобы показать, что и как я тестировал.
- он должен избегать
"
- хитрость заключается в том, чтобы добавить еще одну группу захвата, которая включает текущую
(...)
,
которая из-за позиции все еще1
- демонстратор заключает совпадающую строку в «—«, чтобы показать, что было сопоставлено, это то, что, как я понимаю, вы хотите
- комментарии все еще существуют, потому что они НЕ совпадают
- msgid и msgstr ОТСУТСТВУЮТ в выходных данных, потому что они совпадают, как и ваше регулярное выражение
Для данного образца входных данных он выдает выходные данные:
#:some comment
--
"CCCCC"
--
#: some comment
--
"CCCCC"
"DDDDD"
--
#:some comment
--
"CCCCC"
"DDDDD"
"EEEEE"
--
Регулярное выражение в вашем вкусе было бы (я думаю)
msgid ""((([^n#])*(n )) )msgstr ""
Дайте мне знать, какой язык / инструмент / вкус вы используете, и покажите мне свой код (а не только регулярное выражение), и я адаптирую ответ, чтобы он более точно соответствовал вашим потребностям.
Вы сказали, что хотите сопоставить текст между msgid и msgstr. Я прочитал, что включить ""
сообщение с сообщением * НЕ с соответствующим текстом. Это не соответствует желаемому результату.
Если желаемый результат важнее описания, я также могу изменить его, но мне нужен ваш код в дополнение к вашему регулярному выражению.