【问题标题】:Regex that matches certain characters and single wildcard匹配某些字符和单个通配符的正则表达式
【发布时间】:2018-12-17 06:34:46
【问题描述】:

我正在尝试创建一个正则表达式来查找字符串中的某些字符和一个通配符(或任何其他给定数量的通配符)。

字符可以是任何字母 a-z,通配符也是如此。

到目前为止,我有:^[poe]+$

我对上面正则表达式的意图是匹配任何长度的任何单词,其中仅包含字母 poe 和可选的 一个 其他字母。一些可以匹配的“单词”:

  • PPEEOX
  • PO
  • EEP

但不匹配:

  • PPPXY
  • XYP

【问题讨论】:

  • 你能添加一些样本匹配和不匹配的输入吗?
  • 请提供一些匹配示例
  • 你说“应该匹配包含这些字母和一个其他字母的单词”这是否意味着匹配的单词具有这三个字母和另一个或者整个字符串都有?你之前在一个字符串中说。
  • 我已经添加了一些说明
  • 试试\b(?=\w*[epo])[epo]*+[^\Wepo]?+[epo]*\b。在此处查看现场演示regex101.com/r/gi7PQx/1

标签: regex


【解决方案1】:

如果您想断言四个字符以任意顺序出现,那么前瞻可能是这里的一种选择:

^(?=.*p)(?=.*o)(?=.*e)(?=.*q)[A-Za-z]{4,}$

这假设您要匹配每个poe,以及第四个字母q

【讨论】:

  • 字母POE可以是任意顺序,每个单词可以出现0次或多次。应该匹配 0 或 1 次。
【解决方案2】:

[poe]{3}[a-zA-Z]{1}

这意味着“有[任何一个'p'或'o'或'e']{出现3次}然后[任何字母]{出现1次}”,跳过开始标记和结束标记。

【讨论】:

  • 还将匹配“pppq”等,而不是 p、o 和 e 中的至少一个 - 假设这是 OP 想要的。
  • 它还要求 [poe] 都在第四个字母之前,这似乎不是必需的。所以“闷闷不乐”是不匹配的。
  • 让 OP 解释一下。这也可以被认为是预期的答案,只要 OP 没有提供适当的示例。
【解决方案3】:

使用?= 前瞻搜索特定字母,使用\b 边界限制为3-4 个字母:

/\b(?=\w*p)(?=\w*o)(?=\w*e)[a-zA-Z]{3,4}\b/

【讨论】:

  • 你最好把.*替换成\w*,否则它会匹配ACDB #$%poe中的ACDB
  • @revo 哦,是的。还添加了^$ 以匹配整个字符串
  • 如果你添加那些你不需要的锚点\bs。但由于我们不知道 OP 是否尝试匹配整个输入字符串,所以最好不要有 ^$ 锚。
  • 我明白了。知道了。今天早上我刚刚在学习这个正则表达式。我在 stackoverflow 中学到的东西比其他任何地方都多,这就像与合法导师一起做一个实际项目。
【解决方案4】:

如果[POE] 的字符之一应该在字符串中,[POE] 可以出现 0 次或多次,通配符出现 0 或 1 次,您可以使用正向前瞻,并且对于通配符使用字符类 @ 987654325@ 的范围与 POE 不匹配:

^(?=.*[POE])[POE]*[A-DF-NQ-Z]?[POE]*$

Regex demo

这将匹配

  • ^ 字符串开头
  • (?=.*[POE])
  • [POE]* 匹配 0+ 次 POE
  • [A-DF-NQ-Z]? 匹配一个可选的不是[POE]
  • [POE]* 匹配 0+ 次 POE
  • $断言行尾

【讨论】:

  • 这似乎像你描述的那样工作。但它只匹配例如'pose',而它也应该匹配'pos'。 POE 可以匹配 0 次或多次。通配符 0 或 1 次。
  • @Stefan 你是这个意思吗? regex101.com/r/tQlqxj/1 是大写还是小写?我已经更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多