2016-12-30 91 views
1

我有一个文件,其中无数条线包含这样的双引号:如何在行包含双引号时捕获行尾?

"foo 
bar 
"bam" 
foo "bar 

,我要拍摄包含双引号每一行的末尾。 但我不希望它捕捉到最后包含双引号的行。 刚刚结束的"foofoo "bar应该匹配。

我目前卡住尝试使用多重利好的回溯期是这样的: (?<=")(?=.*)[^"]$

+0

您仍然可以使用'^“。* [^”] $' - 请参阅[此演示](https://regex101.com/r/uNpuDB/2)。 'replaceAll(“(?m)^ \”。* [^ \“] $”,“$ 0 \”“)'。我只是想知道你将如何处理''foo'bar' –

+0

@RadLexus我改变了它 – Busti

+0

@WiktorStribiżew这个捕获了整条线,我只希望捕获它的末尾,因为我想追加缺少的双引号 – Busti

回答

2

这个正则表达式会发现(和替换)仅在他们奇数"的台词:

search_pattern = "(?m)^[^\"\n\r]*\"[^\"\n\r]*(?:\"[^\"\n\r]*\"[^\"\n\r]*)*$"; 
replace_pattern = "$0\""; 
the_string.replaceAll(search_pattern, replace_pattern); 

最重要的部分是:

  • (?m)计数作为的开头/结尾而不是整个字符串的/。
  • [^\"\n\r]*"系列非换行字符。
  • (?:\"[^\"\n\r]*\"[^\"\n\r]*)正好两个"字符的序列以及任何数量的非"和非换行符。 (该*后记允许任意数量的"对。)

如果你在Linux或有Sed则安装,你也可以从终端或shell称之为:

sed -r 's/^[^"\n\r]*"[^"\n\r]*("[^"\n\r]*"[^"\n\r]*)*$/\0"/' the_file.txt 
+0

这将工作,如果我有权访问替换模式。可悲的是我没有。我也经历了约。同时手动输入1.2k行。 尽管感谢您的答复。 – Busti

+0

接受为最准确的答案,即使超出了实际问题的范围。请记住,它并不能完全解决问题。 – Busti

0

插入缺少使用类似记事本++或升华双引号:

Find: (?m)^".*[^"]$ 
Replace: \0" 

注缺乏群体 - 整场比赛被放回。

+0

我的文本编辑器不支持替换正则表达式。我当然可以编写一个Java程序来完成这项工作,但是由于我已经完成了手动完成工作,我只是想出于好奇而找到一个解决方案。 – Busti

+0

下载和使用(免费)记事本++或崇高和你的生活会更容易 – Bohemian

-1

我不明白你是什么意思end of line但这里是一个工作的正则表达式捕捉其中包含双引号,但不是在最后行:^.*(?:").*[^"]$

你可以在这里试试这个:http://rubular.com/r/ppKo7E3qDP

相关问题