【问题标题】:How do I build a regex to match a pattern while excluding certain known words that would match the pattern如何构建正则表达式以匹配模式,同时排除某些与模式匹配的已知单词
【发布时间】:2018-02-27 17:44:18
【问题描述】:

如何构建正则表达式以匹配模式,同时排除某些与模式匹配的已知单词。例如,我有这个字符串:

我喜欢在去打球时保持清醒。

我有以下正则表达式:\b(.{1,2}(\s|.|-|_)){2,}

这匹配:

到 d.r.e.a.m at

做自己的事情。

我想要的是改变这个正则表达式以匹配:

d.r.e.a.m

h i k i n g.

如果我把它改成这个 \b([^(to)]{1,2}(\s|.|-|_)){2,}

它会部分工作,但它会排除个别字母,如 't' 'o' 而不是整个单词 'to'

如何解决?

【问题讨论】:

  • 首先,您是如何使用正则表达式获得该输出的?我在不是to d.r.e.a.m atto do h i k i n g 的组中得到g.g.
  • (?:\b[^\W_][\s._-]){2,} 呢?
  • 你有d.r.e_a-m这样的词吗?如果是,它们应该匹配吗? hi.k.i.n.g呢?
  • h i k i n g 末尾的点一定吗?如果没有,那么\b\w([\s._-])\w(?:\1\w)+.
  • 您尝试使用哪种编程语言?

标签: regex


【解决方案1】:

你可以使用

/\b(?!(?:I|at|[td]o)\b)\w{1,2}(?:[\W_](?!(?:I|at|[td]o)\b)\w{1,2})*\b/

this Rubular demo

匹配

  • \b - 单词边界
  • (?!(?:I|at|[td]o)\b)\w{1,2} - 后跟不等于 Iattodo 的 1 或 2 个字符字符
  • (?:[\W_](?!(?:I|at|[td]o)\b)\w{1,2})* - 0+ 次重复:
    • [\W_] - 非单词字符或_
    • (?!(?:I|at|[td]o)\b)\w{1,2} - 见上文
  • \b - 单词边界。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多