Java 将字符串拆分为 '\r\n' 、 '\r' 或 '\n' 并与前面的子字符串保持一致

标签 java regex

我的输入字符串包含混合类型的行分隔符,包括“\r\n”、“\r”或“\n”。我想拆分字符串并保留行分隔符及其前面的子字符串。我关注了下面的两个帖子

How to split a string, but also keep the delimiters?

Split Java String by New Line

然后想出类似的东西:

String input = "1 dog \r\n 2 cat";
String[] output = input.split( "(?<=((\\r\\n)|\\r|\\n))")));

输出是 ["1 dog\r", "\n", "2 cat"],但是期望的输出是 ["1 dog\r\n", “2 只猫”]

如果我将输入更改为 String input = "1 dog\r 2 cat";String input = "1 dog\n 2 cat";,我的代码可以产生所需的输出。请指教。提前致谢。

最佳答案

你得到你的结果 ["1 dog\r", "\n", "2 cat"] 因为你的模式使用了一个交替匹配 (\r\n )\r\n

当在示例字符串中遇到\r\n时,lookbehind断言在\r之后将为真,并且会第一次拆分。

然后在 \n 之后 lookbehind 断言将为真,并将进行第二次拆分。

你可能会做的是在正后视中使用 \R 来断言左边的是 unicode newline sequence :

String input = "1 dog \r\n 2 cat";
String[] output = input.split("(?<=\\R)");

Java demo

修复正则表达式的另一种方法是将其设为 atomic group :

(?<=(?>\\r\\n|\\r|\\n))

Java demo

阅读 this post ,当 \r 在 lookbehind 中使用原子组匹配时,下面的 \n 也匹配。

关于Java 将字符串拆分为 '\r\n' 、 '\r' 或 '\n' 并与前面的子字符串保持一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55566172/

相关文章:

python - 正则表达式匹配中的变音符号(通过语言环境?)

javascript - 为什么 String.prototype.match() 返回 null 而不是空数组?

java - Azure 资源管理 Rest API 的授权 token 生成

java - 返回ThreadPool时清除ThreadLocal值

java - 将字符串变量的内容分成两部分

python - 解析姓名和学位?

c++ - std::regex_replace 给了我意想不到的结果

Java - 匹配器在访问组后抛出 IllegalStateException

java - 如何配置 m2e eclipse 插件以支持父版本范围?

java - Netbeans 中的数据库和 Java