【问题标题】:Java regex mix two patternsJava 正则表达式混合两种模式
【发布时间】:2015-08-30 01:56:35
【问题描述】:

我怎样才能让这个模式起作用:

Pattern pattern = Pattern.compile("[\\p{P}\\p{Z}]");

基本上,这将用任何类型的标点符号(p{P} 或任何类型的空格(p{Z})分割我的 String[] 句子。但我想排除以下情况:

(?<![A-Za-z-])[A-Za-z]+(?:-[A-Za-z]+){1,}(?![A-Za-z-])

这里解释的模式:Java regex patterns

这些连字符是这样的:“aaa-bb”、“aaa-bb-cc”、“aaa-bb-c-dd”。那么,我可以这样做吗?

【问题讨论】:

  • [\\p{P}\\p{Z}^-] 是我的猜测
  • 我不想允许这样:“--aa”或“bb--c”等。这两种模式有效,我只需要将两者混合。
  • 好吧,那么……也许是[\\p{P}\\p{Z}^(?&lt;![A-Za-z-])[A-Za-z]+(?:-[A-Za-z]+){1,}(?![A-Za-z-])]
  • 对不起,你的问题不是很清楚。您想匹配不是连字符的单词之间的任何拆分?

标签: java regex


【解决方案1】:

不幸的是,至少据我所知,您似乎无法合并这两个表达式。

但是,也许您可​​以重新表述您的问题。

例如,如果您想在单词之间进行拆分(可以包含连字符),请尝试以下表达式:

(?>[^\p{L}-]+|-[^\p{L}]+|^-|-$)

这应该匹配任何非减号或非字母字符后面的任何减号或输入中的第一个或最后一个字符的非字母字符序列。

使用此表达式进行拆分会导致:

input="aaa-bb, aaa-bb-cc, aaa-bb-c-dd,no--match,--foo"
ouput={"aaa-bb","aaa-bb-cc","aaa-bb-c-dd","no","match","","foo"}

正则表达式可能需要一些额外的优化,但这只是一个开始。

编辑:这个表达式应该去掉拆分中的空字符串:

(?>[^\p{L}-][^\p{L}]*|-[^\p{L}]+|^-|-$)

第一部分现在读作“任何非减号后跟任意数量的非字符字符的非字符”,并且也应该匹配.--

编辑:如果您想匹配可能包含连字符的单词,请尝试以下表达式:

(?>(?<=[^-\p{L}])|^)\p{L}+(?:-\p{L}+)*(?>(?=[^-\p{L}])|$)

这意味着“任何字母序列 (\p{L}+) 后跟任意数量的由一个减号和至少一个字母 ((?:-\p{L}+)*+) 组成的序列。该序列之前必须有开头或任何不是字母或减号 ((?&gt;(?&lt;=[^-\p{L}])|^)) 后跟任何不是字母或减号或输入结尾的内容 ((?&gt;(?=[^-\p{L}])|$))"。

【讨论】:

  • 嗯,谢谢。但我需要排除“-”首先出现的情况,例如:“-a”、“-aa-bb”等。
  • @user974594 所以"-aa-bb"不应该分成"""aa-bb"?您能否提供一个示例输入和预期输出?目前还不清楚您实际想要达到的目标。
猜你喜欢
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多