【问题标题】:Java Regex: Split based on non-word characters except for apostropheJava Regex:基于除撇号以外的非单词字符进行拆分
【发布时间】:2016-09-19 17:15:28
【问题描述】:

我正在尝试根据空格和非单词字符进行拆分和包含,撇号除外。

我已经能够根据空格和非单词字符对其进行拆分和包含,但我似乎无法弄清楚如何从非单词字符中排除撇号。

这是我当前的正则表达式...

str.split("\\s|(?=\\W)");

...在此代码示例上运行时:

program p;
begin
    write('x');
end.

...产生这个结果:

program
p
;
begin

write
(
'x   <!-- This is the problem.
'
)
;
end
.

这几乎是正确的,但我的目标是跳过撇号,结果如下:

program
p
;
begin

write
(
'x'   <!-- This is the wanted result.
)
;
end
.

更新

按照建议我已经尝试过:

str.split("\\s|(?=\\W)(?<=\\W)");

这几乎可以工作,但不能正确拆分所有特殊字符:

program
p;
begin
write(
'x'
)
;
end.

【问题讨论】:

  • 这对你有用吗:([^\\w']+)
  • Java support character class subtraction 吗?如果确实如此,可能对您的情况有所帮助。
  • @Toto Hmm 使撇号工作,但它不包括其他特殊字符:program mini begin write 'x' end
  • 我似乎不知道如何从非单词字符中排除撇号。试试[\w&amp;&amp;[^']]

标签: java regex


【解决方案1】:

你试过了吗……

[^\w']

这将匹配任何既不是单词字符也不是撇号的字符。根据您的输入,工作可能足够简单。

如果您使用[^\w'] 作为您的正则表达式和\n\1\n 作为您的替换字符串运行替换操作,它应该让您接近您想要的位置。

【讨论】:

  • 这是说匹配所有不是单词字符而不是撇号...[^\w]和@之间有区别987654327@。请重新考虑您的反对意见。 Reference thisthis.
【解决方案2】:

你可以分开。

\s|('[^']*')|(?=\W)

查看演示。

https://regex101.com/r/mL7eL6/1

【讨论】:

  • 这在 Regex101 中效果很好,但我不确定如何在 Java 中添加 '\n$1' 替换以使其正确显示。
  • @DarkKnight 在 python 中拆分时...捕获的组自动出现...在 java 中不确定
  • @DarkKnight 你试过了吗。就分开吧
  • 我不确定如何用 Java 替换捕获的组 - 它看起来不像是“拆分”方法的选项。
  • @DarkKnight 你可以使用这个肮脏的修复\s+|(?=[^\w'])|(?='[^']*')...查看演示。regex101.com/r/mL7eL6/2
【解决方案3】:

单独处理撇号并要求前面的非单词:

str.split("\\s+|(?=[^\\w'])|(?<=\\W)(?=')");

live demo

【讨论】:

  • 嗯 - 这会拆分一些特殊字符,但不是全部:program mini;开始写('x');结束。
【解决方案4】:

作为替代方法,可以扫描字符串以查找 \b[\w']+\b

【讨论】:

    猜你喜欢
    • 2015-06-15
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 2020-04-18
    • 2015-07-09
    相关资源
    最近更新 更多