regex - 如何使用注释创建正则表达式搜索和替换?

标签 regex perl

我有一个奇怪的问题:我有一个代码(它是 LaTeX,但在这里并不重要),其中包含带有句点(句子)的长行。 为了更好的版本控制,我想将这些句子分别放在一个新行上。 这可以通过 sed 's/\. /.\n/g' 来实现.

现在,如果评论也带有潜在句号,就会出现问题。 这些注释不得更改,否则它们将被解析为 LaTeX 代码,这可能会导致错误等。

作为一个伪示例,您可以使用

Foo. Bar. Baz. % A. comment. with periods.

结果应该是

Foo.
Bar.
Baz. % ...

或者,注释可以毫无问题地放在下一行。

使用perl就可以了如果这样会更好的话。我尝试了不同的程序( sedperl )一些想法,但没有一个达到我的预期。要么评论也被更改,要么仅更改第一个句点 ( perl -pe 's/^([^%]*?)\. /\1.\n/g' )。

你能指出我正确的方向吗?

最佳答案

这很棘手,因为您实际上是在尝试匹配所有不跟在“%”后面的“.”。负向后查找在这里很有用,但 Perl 不支持可变宽度负向后查找。 (尽管在某些情况下有 hideous ways of faking it。)我们可以使用回溯控制动词在这里没有它:

s/(?:%(*COMMIT)(*FAIL))|\.\K (?!%)/\n/g;

(?:%(*COMMIT)(*FAIL)) 通过提交匹配然后无条件失败来强制替换在第一次看到“%”时停止,从而防止返回-追踪。 “真正的”匹配遵循交替:\.\K (?!%) 查找句点后面的空格且后面不跟“%”。 \K 导致句点不包含在匹配中,因此我们不必将其包含在替换中。我们只匹配和替换空格。

关于regex - 如何使用注释创建正则表达式搜索和替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33828197/

相关文章:

python - 我可以使用什么正则表达式从该字符串中捕获组?

r - 如何在 R 中使用正则表达式匹配并包含条件?

string - 在 Perl 中以逗号分隔的列表中的字符串部分中的字母替换数字

Perl 找不到对象方法

Excel::Writer::XLSX 内容不可读错误

python - 为什么 Perl 和 Python 的 "\n"打印输出不同?

javascript - 用正则表达式匹配同一个词两次,不关心这个词是什么

Java regex - 组合表达式

python - 带有 Lookbehind 的正则表达式拆分丢失了下半部分

perl - 如何提取多个文件中的公共(public)行?