我有一个多行字符串,其中包含换行符 (\n) 和不间断空格字符 (\u00A0),后者显示是为了便于阅读:
示例 1
dog
\u00A0cat
mat
示例 2
bat
can
\u00A0boo
仅当“\n”的第一个实例后跟“\u00A0”时,我想返回 java 正则表达式匹配
因此:
- 样本 1 会匹配。
- 示例 2 不会,因为“bat”后的第一个“\n”后面是“can”而不是“\u00A0”。
我正在努力解决这个问题,我所能得到的只是通过一个简单的方法来匹配两个样本: \n\u00A0 如下面的屏幕截图所示。任何建议表示赞赏,我认为我需要使用负面的展望,但无法弄清楚如何。
谢谢。
最佳答案
您可以使用
s.matches(".*\\R\\u00A0(?s).*")
正则表达式匹配
^
(隐含在.matches
中)- 字符串开头.*
- 第一行\\R
- 换行符\\u00A0
- 硬空间(?s).*
- 任何 0+ 字符,尽可能多(由于内联(?s)
DOTALL 修饰符而匹配换行符)<\z
(隐含在.matches
中)- 字符串结尾
在 Java 7 及更早版本中,\R
应替换为 \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
,或者仅匹配 CR 和 LF 结尾,请使用 (?:\r\n?|\n)
。
String pattern = ".*\\R\\u00A0(?s).*";
System.out.println("dog\n\u00A0cat\nmat".matches(pattern));
System.out.println("bat\ncan\n\u00A0boo".matches(pattern));
输出:
true
false
使用 Matcher#find
的解决方案甚至更容易,因为您不必检查整个字符串的有效性,因此不必担心使用 Pattern.DOTALL
或类似 [^\n]
的模式:
String pat = "^.*\n\\u00A0";
Pattern p = Pattern.compile(pat);
Matcher m = p.matcher(s);
System.out.println(m.find());
关于java - 正则表达式匹配第一个新行后跟不间断空格字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49390990/