Java 中的 RegEx:如何处理换行符

2023-12-23

我目前正在尝试学习如何使用正则表达式,所以请忍受我的简单问题。例如,假设我有一个输入文件,其中包含一堆由换行符分隔的链接:

www.foo.com/Archives/monkeys.htm
Monkey 网站的描述。

www.foo.com/Archives/pigs.txt
Pig 网站的描述。

www.foo.com/Archives/kitty.txt
Kitty 网站的描述。

www.foo.com/Archives/apple.htm
苹果网站的描述。

如果我想获取一个网站及其描述,这个正则表达式似乎适用于测试工具:.*www.*\\s.*Pig.*

但是,当我尝试在我的代码中运行它时,它似乎不起作用。这个表述正确吗?我尝试用“\n”替换“\s”,但它似乎仍然不起作用。


这些线可能由\r\n在你的文件中。两个都\r(回车)和\n(换行符)在 Java 正则表达式中被视为行分隔符,并且.元字符不会与它们中的任何一个匹配。\s将匹配这些字符,因此它会消耗\r,但这留下了.*来匹配\n,失败了。您的测试仪可能只使用过\n来分隔线,这被消耗了\s.

如果我是对的,改变\s to \s+ or [\r\n]+应该让它发挥作用。在这种情况下,这可能就是您需要做的全部事情,但有时您必须精确匹配一个行分隔符,或者至少跟踪匹配的行分隔符数量。在这种情况下,您需要一个与三种最常见的行分隔符类型之一完全匹配的正则表达式:\r\n(Windows/DOS),\n(Unix/Linux/操作系统)和\r(较旧的 Mac)。其中任何一个都可以:

\r\n|[\r\n]

\r\n|\n|\r

Update:从 Java 8 开始,我们还有另一个选择,\R http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#lineending。它匹配任何行分隔符,不仅包括\r\n,但其他几个定义为统一码标准 http://www.unicode.org/reports/tr18/#Line_Boundaries。它相当于这样:

\r\n|[\n\x0B\x0C\r\u0085\u2028\u2029]

以下是您可以如何使用它:

(?im)^.*www.*\R.*Pig.*$

The i选项使其不区分大小写,并且m将其置于多行模式,允许^ and $匹配行边界。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中的 RegEx:如何处理换行符 的相关文章

随机推荐