【问题标题】:Regex to match if very first new line is followed by a non breaking space character如果第一个换行符后跟一个不间断空格字符,则匹配正则表达式
【发布时间】:2018-03-20 17:48:05
【问题描述】:

我有一个多行字符串,其中包含换行符 (\n) 和不间断空格字符 (\u00A0),后者为了便于阅读而显示:

示例 1

dog  
\u00A0cat  
mat  

示例 2

bat  
can  
\u00A0boo

我想仅在 '\n' 的第一个实例后跟 '\u00A0' 时返回 java 正则表达式匹配

因此:

  • 样本 1 匹配。
  • 示例 2 不会因为 'bat' 之后的第一个 '\n' 后跟 'can' 而不是 '\u00A0'。

我正在为此苦苦挣扎,我所能得到的只是一个简单的两个样本的匹配项: \n\u00A0 根据下面的屏幕截图。任何建议表示赞赏,我认为我需要使用负面的展望,但无法弄清楚如何。

谢谢。

Match as expected

Do not want a match

【问题讨论】:

  • 不确定您是否打算使用 <pre> 在 Stackoverflow 上定义代码块,或者您是否打算使用正确的 markdown as per this help page
  • 另外,您是在读取文件吗?因为这样你就可以使用循环读取每一行,如果找到第一个匹配项,就可以从循环中中断。
  • 试试s.matches(".*\n\\u00A0(?s).*")
  • 或者s.matches("[^\n]*\n\u00A0(?s:.*)")如果你想更明确
  • @elworthy 您必须选择使用 JavaScript 选项进行测试。在 regex101 上测试这样的模式时,您应该使用 PHP/PCRE。

标签: java regex


【解决方案1】:

你可以使用

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)

Java demo:

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 或@987654339 之类的模式@:

String pat = "^.*\n\\u00A0";
Pattern p = Pattern.compile(pat);
Matcher m = p.matcher(s);
System.out.println(m.find());

【讨论】:

  • 查看早期的 cmets - \u00A0 不能与 (?s) 一起使用。返回的错误是“前面的token不可量化”。
  • @elworthy 你肯定测试错了,或者你使用的是旧版本的 Java。请参阅在线演示,并将输出添加到答案中。
  • 我只用 javascript 在 regex101 上进行了测试,所以 matcher#find 是我使用的解决方案。谢谢。
【解决方案2】:

^[^\n]+\n\u00A0.*$ 应该可以解决这个问题。

Pattern p = Pattern.compile("^[^\n]+\n\u00A0.*$",Pattern.DOTALL);
Matcher m = p.matcher(myString);
System.out.println("Did it match: " + m.find());

【讨论】:

  • 使用Matcher#find,解决方案更加简单。 "^.*\\n\\u00A0" 并且不需要 Pattern.DOTALL
  • 谢谢你们,最初的解决方案在 regex101.com 上对我有用,但只有在删除 $ 并使用时:^[^\n]+\n\u00A0.* 已将此解决方案实施为每个@WiktorStribiżew:^.*\n\\u00A0
猜你喜欢
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
相关资源
最近更新 更多