【问题标题】:RegEx: Allow for a single dot after one possible letter正则表达式:在一个可能的字母之后允许一个点
【发布时间】:2016-05-04 21:17:06
【问题描述】:

感谢answer by Wiktor Stribiżew 及其详细讨论,我有一个正则表达式(\p{L}+(?:\s+\p{L}+)*) 可以捕获字符(也是Unicode),例如一个点 (.) 和一个分号 (;)。但我只想在它之前有一个字符(它可能是 unicode 字符)并且它之后有一些字符时才捕捉一个点。让我给你一些例子。 RegEx 正确捕获例如:

WOJCIECH T ZAŁUSKA
WOJCIECH ZAŁUSKA
WOJCIECH Ted ZAŁUSKA

但无法正确捕捉:

WOJCIECH T. ZAŁUSKA

除了圆点 (WOJCIECH T ZAŁUSKA) 之外,我得到了所有东西,我也想抓住这个圆点。

所以,我想像上面那样捕捉字符串。我需要的更多示例:

Ted J. Knox
Chris Jay J. Nick

在有多个点的字符串中,只应考虑第一个点。让我举一个我不喜欢抓住的例子。考虑以下字符串:

WOJCIECH T. ZAŁUSKA. Adam

只应捕获WOJCIECH T. ZAŁUSKA。我试过(\p{L}+(?:\s+\p{L}+\.)*),但它捕获的点不止一个,缺点也更多。

【问题讨论】:

  • 这些字符串是独立的吗?还是在一些标记的文本中?
  • 好吧,如果点只能出现在第二个“单词”之后,请使用\p{L}+(?:\s+\p{L}+\.)?(?:\s+\p{L}+)+
  • 亲爱的@WiktorStribiżew 它们是独立的:一个字符串 = 一个正则表达式。您的 RegEx 一如既往地完美。我无法形容我对您的持续帮助感到多么感激。
  • (\p{L}+(?:\s+\p{L}\.)*)|((\.\s).*$)

标签: regex unicode


【解决方案1】:

如果点只能出现在第二个“单词”之后,请使用

\p{L}+(?:\s+\p{L}\.)?(?:\s+\p{L}+)+

regex demo

模式将匹配:

  • \p{L}+ - 1 个或多个字母
  • (?:\s+\p{L}\.)? - 1 或 0 个 1+ 空格 + 1 个字母 + 点的序列
  • (?:\s+\p{L}+)+ - 1+ 1+ 空格 + 1 个或多个字母的序列

【讨论】:

  • \h\s有什么区别?
  • \h 代表水平空格(它不匹配换行符和回车),而 \s 匹配所有空格。我通常在在线测试人员处使用\h,以免溢出到下一行(因为通常在那里测试行,而不是整个字符串)。
  • hmm.. 很酷.. 很奇怪,因为当我将表达式更改为使用 \s 时,它不会突出显示与 \h 相同的内容。
  • 顺便说一句,Chris Jay J. Nick 不应该赶上Chris Jay J. 吗?
  • 我对这些情况有一个想法:(?<!\.\h)\b\p{L}+(?:(?:\h+\p{L}+)*(?:\h+\p{L}\.)(?:\h+\p{L}+)*|(?:\h+\p{L}+)*)。如果字符串出现在更大的上下文中,不确定它是否会正常工作。如果WOJCIECH T. ZAŁUSKA. Adam 根本不应该匹配并且字符串是单独测试的,那么,^\p{L}+(?:(?:\h+\p{L}+)*(?:\h+\p{L}\.)(?:\h+\p{L}+)*|(?:\h+\p{L}+)*)$ 可以使用。但是:如果WOJCIECH T. ZAŁUSKA必须在那里匹配,而Adam不应该匹配,^\p{L}+(?:(?:\h+\p{L}+)*(?:\h+\p{L}\.)(?:\h+\p{L}+)*|(?:\h+\p{L}+)*)就可以了。
猜你喜欢
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
相关资源
最近更新 更多