【问题标题】:How to do 'NOT' in regex?如何在正则表达式中做“不”?
【发布时间】:2013-08-29 12:57:19
【问题描述】:

我正在尝试在 Java 中使用拆分函数。我要拆分的角色是;

所以我的代码是这样的:

string.split(";");

但是,在字符串中我有很多转义 \;。我想要一个不会在\; 处拆分但仅在; 独立的地方拆分的正则表达式。

字符串示例:

sometexthere\;shhshshshhs;shhshshshshs\;dddddd;

预期结果:

[0] sometexthere\;shhshshshhs;
[1] shhshshshshs\;dddddd;

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 会有sometext\\;somemoretext这样的东西吗?那么预期的结果是什么?
  • 当你写字符串时,它有无效的转义序列,编译器不能接受。

标签: java regex split


【解决方案1】:

试试这个:

str.split("(?<!\\\\);");

编辑

如果您确实想在结果数组中使用拆分器(;):

str.split("(?<=[^\\\\];)");

请注意,单个后视足以解决此问题。

这一次,我做了一个测试:

final String str = "sometexthere\\;shhshshshhs;shhshshshshs\\;dddddd;";
System.out.println(Arrays.toString(str.split("(?<=[^\\\\];)")));

它输出:

[sometexthere\;shhshshshhs;, shhshshshshs\;dddddd;]

【讨论】:

  • java.util.regex.PatternSyntaxException。要在原始正则表达式中指定(?&lt;!\\),您需要在Java 文字字符串中写入(?&lt;!\\\\)
  • 它在我的机器中抛出 PatternSyntaxException。
  • @nhahtdh 是的,我没有测试它,忘记转义 every 反斜杠....谢谢。固定
  • 刚刚注意到 Pshemo 的解决方案产生了预期的结果,而您的解决方案将删除 ;
  • @nhahtdh 啊.. thx,我没有注意到半成品还在。添加解决方案。
【解决方案2】:

如果您不想删除;,请尝试使用split("(?&lt;=(?&lt;!\\\\);)"),但只是在它之后拆分。我们在这里使用 double look-behind mechanisms:

  • 积极的后视(?&lt;=...)
  • 消极的后视(?&lt;!...)

(?&lt;=;) 会找到之前有; 的地方,但我们还必须确保; 之前没有\,所以我们可以将其写为(?&lt;=(?&lt;!\\\\);)

【讨论】:

  • 可以使用[^\\](raw string) 代替嵌套的look-behind。
  • @Kent 是的,我在你的回答中看到了 :) 但由于重复答案没有意义,我不会将这些信息包含在我的信息中,但会保持原样以显示替代方式。跨度>
  • 没问题。老实说,这是我第一次看到嵌套的后视表达式。 ;) 很高兴知道通往罗马还有另一种方式。
  • @Kent 不管怎样,我只是希望 OP 在他的数据开始时不要使用 ; 因为你当前的正则表达式不会拆分它,即使它之前没有 \。
猜你喜欢
  • 2012-11-29
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2022-07-27
相关资源
最近更新 更多