我有一些數據,看起來像這樣正則表達式匹配EOF
john, dave, chris
rick, sam, bob
joe, milt, paul
我使用這個正則表達式匹配的名字
/(\w.+?)(\r\n|\n|,)/
其中工程大部分,但該文件突然結束在最後一個字的含義之後,最後一個值不以\r\n
,\n
或,
結束,並以EOF結束。有沒有辦法在正則表達式中匹配EOF,所以我可以把它放在第二個分組中?
我有一些數據,看起來像這樣正則表達式匹配EOF
john, dave, chris
rick, sam, bob
joe, milt, paul
我使用這個正則表達式匹配的名字
/(\w.+?)(\r\n|\n|,)/
其中工程大部分,但該文件突然結束在最後一個字的含義之後,最後一個值不以\r\n
,\n
或,
結束,並以EOF結束。有沒有辦法在正則表達式中匹配EOF,所以我可以把它放在第二個分組中?
的這個問題的答案是\Z
花了一段時間來弄明白,但現在的工作。需要注意的是相反的,\A
比賽開始的整個字符串(而不是^
和$
匹配一行的開始)。
假設你使用正確的修飾符強制治療的字符串作爲一個整體(未行由行 - 如果\ n爲你的作品,你正在使用它),只需添加另一種選擇 - 字符串的結尾:(\ r \ N | \ n |,| $)
/(\w.+?)(\r\n|\n|,|$)/
EOF實際上不是一個字符。如果您有多行字符串,則'$'將匹配字符串的末尾以及行的末尾。
在Perl及其弟弟中,\A
和\Z
匹配字符串的開頭和結尾,完全忽略換行符。
對POSIX正則表達式的GNU擴展使用\`
和\'
來做同樣的事情。
你真的有捕捉行分隔符?如果沒有,這個正則表達式應該是所有您需要:
/\w+/
這是假設你想匹配的子字符串在你的例子完全由字字符,等等。
也許嘗試$(EOL/EOF),而不是(\ r \ n | \ n)的?
/\"(.+?)\".+?(\w.+?)$/
對比度瑞安的建議\的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經濟特區:
\Z Match only at end of string, or before newline at the end \z Match only at end of string
測試用例翻譯成紅寶石(1.8.7,1.9 .2)表現相同。
在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。
最近我在尋找類似的東西,但是用於JavaScript。
把這個在這裏,讓任何人具有相同的問題可以受益
var matchEndOfInput = /$(?![\r\n])/gm;
基本上,這將匹配線,這不跟回車或換行字符結束。本質上這與\Z
相同,但是對於JavaScript。
您是否試圖在每個名稱的一個組或一個捕獲組中捕獲所有名稱? – 2009-07-23 12:04:12
這是什麼平臺? – 2009-07-23 13:32:01
正則表達式遇到問題時要做的一件事就是單獨嘗試你的模式元素。如果您最後關注該標記,請在沒有標記的情況下測試您的表達。 – akf 2009-07-23 13:33:16