【问题标题】:A regular expression for \b\b 的正则表达式
【发布时间】:2009-09-22 06:18:34
【问题描述】:

我正在用 Java 为 unicode 文本编写正则表达式。然而,对于我正在使用的特定脚本 - 梵文 (0900 - 097F),单词边界存在问题。 \b 匹配依赖元音的字符(如 093E-094C),因为它们被视为空格字符。

示例: 假设我有字符串:“कमल कमाल कम्हल कम्हाल” 请注意,第二个单词中的“मा”是由 म 和 ा(识别为空格字符)组合而成的。最后一句话也是如此。 这导致 \b 将 'कमाल' 中的 'ल' 与正则表达式 \b\w\b 匹配,根据语言,该正则表达式不正确。

我希望这个例子有所帮助。

我可以编写一个行为类似于 \b 的正则表达式,但它不匹配某些字符吗?任何反馈将不胜感激。

【问题讨论】:

  • 添加了一个例子。我希望这是有道理的。
  • 可以用[^](不在范围内)表达式来完成吗?
  • 你应该把劳伦斯的回答当成官方回答:他是第一个回答的;)
  • 完成。感谢大家的帮助:) Stackoverflow 摇滚!

标签: regex unicode word-boundary word-boundaries


【解决方案1】:

您应该能够使用以下正则表达式运算符完成您想要的操作:

(?=X)   X, via zero-width positive lookahead
(?!X)   X, via zero-width negative lookahead
(?<=X)  X, via zero-width positive lookbehind
(?<!X)  X, via zero-width negative lookbehind

(以上引自Java 6 Pattern API docs。)

在单词前使用(?&lt;![foo])(?=[foo]) 代替\b,在单词后使用(?&lt;=[foo])(?![foo]) 代替\b,其中“[foo]”是您的“单词字符”集

【讨论】:

【解决方案2】:

单词边界的等价物(如果边界不是您所期望的)将是:

 (?<!=[x-y])(<?=[x-y])...(?<=[x-y])(?![x-y])

这是因为“单词边界”的意思是“一侧有字符而另一侧没有字符的位置)

因此,使用后视和前瞻表达式,您可以定义自己的字符类 [x-y] 以检查何时要隔离“单词边界”

【讨论】:

  • 好的,我想我现在明白了。您和劳伦斯的答案都是正确的,我将哪个标记为正确? :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多