2009-07-23 58 views
59

我有一些數據,看起來像這樣正則表達式匹配EOF

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

我使用這個正則表達式匹配的名字

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

其中工程大部分,但該文件突然結束在最後一個字的含義之後,最後一個值不以\r\n,\n,結束,並以EOF結束。有沒有辦法在正則表達式中匹配EOF,所以我可以把它放在第二個分組中?

+0

您是否試圖在每個名稱的一個組或一個捕獲組中捕獲所有名稱? – 2009-07-23 12:04:12

+4

這是什麼平臺? – 2009-07-23 13:32:01

+0

正則表達式遇到問題時要做的一件事就是單獨嘗試你的模式元素。如果您最後關注該標記,請在沒有標記的情況下測試您的表達。 – akf 2009-07-23 13:33:16

回答

117

的這個問題的答案是\Z花了一段時間來弄明白,但現在的工作。需要注意的是相反的,\A比賽開始的整個字符串(而不是^$匹配一行的開始)。

1

假設你使用正確的修飾符強制治療的字符串作爲一個整體(未行由行 - 如果\ n爲你的作品,你正在使用它),只需添加另一種選擇 - 字符串的結尾:(\ r \ N | \ n |,| $)

0

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

17

EOF實際上不是一個字符。如果您有多行字符串,則'$'將匹配字符串的末尾以及行的末尾。

在Perl及其弟弟中,\A\Z匹配字符串的開頭和結尾,完全忽略換行符。

對POSIX正則表達式的GNU擴展使用\`\'來做同樣的事情。

2

你真的有捕捉行分隔符?如果沒有,這個正則表達式應該是所有您需要:

/\w+/ 

這是假設你想匹配的子字符串在你的例子完全由字字符,等等。

2

也許嘗試$(EOL/EOF),而不是(\ r \ n | \ n)的?

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

對比度瑞安的建議\的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)表現相同。

7

在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。

0

最近我在尋找類似的東西,但是用於JavaScript。

把這個在這裏,讓任何人具有相同的問題可以受益

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

基本上,這將匹配線,這不跟回車或換行字符結束。本質上這與\Z相同,但是對於JavaScript。