Подтвердить что ты не робот

Регулярное выражение соответствует EOF

У меня есть некоторые данные, которые выглядят как

john, dave, chris
rick, sam, bob
joe, milt, paul

Я использую это регулярное выражение для соответствия именам

/(\w.+?)(\r\n|\n|,)/

который работает по большей части, но файл заканчивается внезапно после последнего слова, означающего, что последнее значение не заканчивается на \r\n, \n или ,, оно заканчивается EOF. Есть ли способ сопоставления EOF в регулярном выражении, чтобы я мог поместить его в эту вторую группу?

4b9b3361

Ответ 1

Ответ на этот вопрос \Z заставил меня немного разобраться, но он работает сейчас. Обратите внимание, что, наоборот, \A соответствует началу всей строки (в отличие от ^ и $, соответствующих началу одной строки).

Ответ 2

EOF на самом деле не является символом. Если у вас многострочная строка, то "$" будет соответствовать концу строки, а также концу строки.

В Perl и его братья \A и \Z соответствуют началу и концу строки, полностью игнорируя разрывы строк.

Расширения GNU для регулярных выражений POSIX используют \` и \' для одних и тех же вещей.

Ответ 3

В Visual Studio вы можете найти EOF следующим образом: $(?![\r\n]). Это работает независимо от того, являются ли ваши окончания строки CR, CRLF или просто LF.

В качестве бонуса вы можете гарантировать, что все ваши файлы кода имеют окончательный маркер новой строки, например:

               Find What: (?<![\r\n])$(?![\r\n])
            Replace With: \r\n
 Use Regular Expressions: checked
Look at these file types: *.cs, *.cshtml, *.js

Как это работает:

Найдите любой конец строки (совпадение нулевой ширины), которому не предшествует CR или LF, а также не следует CR или LF. Некоторая мысль покажет вам, почему это работает!

Обратите внимание, что вы должны заменить свой желаемый символ окончания строки, будь то CR, LF или CRLF.

Ответ 4

Контрастность поведения Райана предположила \Z с помощью \z:

$ perl -we 'my $corpus = "hello\n"; $corpus =~ s/\Z/world/g; print(":$corpus:\n")'
:helloworld
world:
$ perl -we 'my $corpus = "hello\n"; $corpus =~ s/\z/world/g; print(":$corpus:\n")'
:hello
world:
$ 

perlre sez:

\Z  Match only at end of string, or before newline at the end
\z  Match only at end of string

Перевод тестового примера в Ruby (1.8.7, 1.9.2) ведет себя одинаково.

Ответ 5

Вам действительно нужно захватить разделители строк? Если нет, это регулярное выражение должно быть всем, что вам нужно:

/\w+/

Предположим, что все подстроки, которые вы хотите совместить, полностью состоят из символов слова, например, в вашем примере.

Ответ 6

Может быть, попробуйте $(EOL/EOF) вместо (\ r\n |\n)?

/\"(.+?)\".+?(\w.+?)$/

Ответ 7

Предполагая, что вы используете правильное форматирование модификатора для обработки строки в целом (а не строки за строкой), и если \n работает для вас, вы ее используете), просто добавьте другую альтернативу - конец строки: (\ r\п |\п |, | $)

Ответ 8

/(\w.+?)(\r\n|\n|,|$)/

Ответ 9

Недавно я искал что-то вроде этого, но для JavaScript.

Поместите это здесь, чтобы любой, у кого есть такая же проблема, мог выиграть

var matchEndOfInput = /$(?![\r\n])/gm;

В основном это будет соответствовать концу строки, за которой не следует возврат каретки или новые символы строки. По сути, это то же самое, что и \Z, но для JavaScript.