【问题标题】:Advanced splitting of search term with regex, respecting rules for hyphens and dots when part of words使用正则表达式对搜索词进行高级拆分,在词的一部分时尊重连字符和点的规则
【发布时间】:2018-06-13 15:53:23
【问题描述】:

我做了一些研究,但我找不到一个我认为很常见的问题的解决方案:

我想拆分搜索词,支持引号并以智能方式处理点和连字符。

我可以写一长串需求,但我认为下面包含所有问题方面的示例更加简单明了:

My test, one. two ASP.net 030-333-12345 end

应该拆分为:

My
test
one
two
ASP.net
030-333-12345 
end

我可以用一些替代品来实现这一点,并在拆分后重新替代,但我想 regex 中的专业人士会更高效、更优雅地一步解决这个问题。

我来了,但这不处理 .并且 - 正确。

var words = Regex
    .Matches(keywords, @"(?<match>\w+)|\""(?<match>[\w\s]*)""")
    .Cast<Match>()
    .Select(m => m.Groups["match"].Value)
    .ToList();

结果是错误的,因为它给出了:

My
test
one
two
ASP
net
030
333
12345 
end

我认为有问题的部分是 \w,因为它对单词的定义不符合我的要求。

【问题讨论】:

  • 试试\w+(?:\S+\w+)*。现场演示regex101.com/r/ESzu53/1
  • 另一个想法:\S+\b(取决于要求)。
  • 我会更加谨慎。这个问题只提到点和连字符,因此我建议@"(?&lt;match&gt;\w+(?:[-.]\w+)*)|""(?&lt;match&gt;\w+(?:(?:\s+|[.-])\w+)*)"""。 Tillito,它对你有用吗?

标签: c# asp.net regex


【解决方案1】:

您正在尝试匹配单词字符和任何非单词字符(如果它们后跟至少一个单词字符):

\w+(?:\S+\w+)*

Live demo

注意:如果您只想包含-.,请将\S 替换为[.-]

\w+(?:[.-]+\w+)*

【讨论】:

  • 这正是我想要的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
相关资源
最近更新 更多