正则表达式匹配字符串以通配符结尾

Posted

技术标签:

【中文标题】正则表达式匹配字符串以通配符结尾【英文标题】:Regex to match string endswith wildcard character 【发布时间】:2021-01-17 17:12:21 【问题描述】:

我正在寻找一个正则表达式,它可以匹配长字符串除以分号,具有不同的模式,它们以通配符* 结尾。例如:

abc-cd;efg-md*;abc:cde:fgh-ui*;jkl-i*;uyz-12*

我写了这个正则表达式

(^|;)(([aA0-zZ9]+)|(\W+))-([aA0-zZ9]+\*)

但它只匹配;efg-md*;abc:cde:fgh-ui*;uyz-12*。它与;jkl-i* 不匹配。

任何人都可以对有效的正则表达式提出建议

【问题讨论】:

[aA0-zZ9] 不是您匹配所有字母和数字的方式。应该是[a-zA-Z0-9] 【参考方案1】:

但它只匹配;efg-md*;abc:cde:fgh-ui*;uyz-12*。它与;jkl-i* 不匹配。

因为;jkl-i* 具有特殊字符。你需要在你的正则表达式中接受

另外,我有一个建议的解决方案。您可以尝试以下正则表达式。

[^;]+\*(?=$|;)

详情

[^;]+:匹配没有;的字符串 \*(?=$|;):如果* 的下一个字符是;end of line.,则匹配字符*

Demo

【讨论】:

谢谢,它起作用了,但不幸的是,我使用的正则表达式不支持正前瞻,无论如何我可以用正前瞻代替吗? 你使用的是什么正则表达式? 是kusto正则表达式,使用re2库github.com/google/re2/wiki/Syntax 我认为您可以使用捕获组([^;]+\*)($|;) 解决问题。使用extract_all 后,你可以选择你想要的字符串。 docs.microsoft.com/vi-vn/azure/data-explorer/kusto/query/…【参考方案2】:

字符类[aA0-zZ9]+ 匹配aA 之一,范围为0-zZ9

范围 0-z 匹配 ASCII table 中的 48-122,并包括字符类中列出的所有其他字符,因此无需添加它们。

但正如您在 ASCII 表中看到的那样,它与 * - 等字符不匹配

但我怀疑您的意思是使用 [a-z0-9]+ 并省略 A-Z,因为示例字符串中没有大写字符。

使用\W 确实匹配所有非单词字符,但在您尝试的模式中,它应该跟在示例数据中不匹配的-


要匹配以* 结尾的字符串,您可以扩展字符类:

^[-0-9a-z+[*;:]+\*$
^ 字符串开始 [-0-9a-z+[*;:]+ 匹配任何列出的字符 1 次以上 \* 匹配 * $字符串结束

Regex demo

【讨论】:

【参考方案3】:

如果您的正则表达式风格不支持环视断言,您可以如下更改正则表达式。 它搜索以* 结尾的非分号字符序列。

[^;]*?\*

Demo

【讨论】:

以上是关于正则表达式匹配字符串以通配符结尾的主要内容,如果未能解决你的问题,请参考以下文章

Shell 学习:正则表达式

Shell 学习:正则表达式

javascript正则表达式

python 正则表达式

正则表达式模块

python 正则表达式规则收集