当前位置:  开发笔记 > 编程语言 > 正文

匹配正则表达式中的可选子字符串

如何解决《匹配正则表达式中的可选子字符串》经验,为你挑选了3个好方法。

我正在开发一种算法来解析一系列短字符串中的数字.这些字符串有些规律,但有一些不同的一般形式和几个例外.我正在尝试构建一组处理各种形式和异常的正则表达式; 我将一个接一个地应用它们,看看我是否得到了一个匹配.

其中一种形式是这样的:

X (Y) Z

哪里:

X是我想要捕捉的数字.

Z是静态的预定义文本.这基本上是我如何确定这种特定形式是否适用.

Y是一个未知长度和内容的字符串,用括号括起来.

另外:Y是可选的; 它并不总是出现在带有Z和X的字符串中.因此,我希望能够从所有这些字符串中提取数字:

10 Z.

20(foo)Z

30(bar)Z

现在,我有一个正则表达式将捕获第一个:

([0-9]+) +Z

我的问题是,我不知道如何构造一个匹配一系列字符的正则表达式,当且仅当它们被括在括号中时.这可以在一个正则表达式中完成吗?



1> Godeke..:
(\d+)\s+(\(.*?\))?\s?Z

注意转义的括号,和?(零或一次)量词.您不想捕获的任何组都可以是(?:非捕获组).

我同意这些空间.\ s是一个更好的选择.我还改变了量词,以确保开头有数字.就换行而言,这将取决于上下文:如果逐行解析文件,则不会出现问题.另一个选择是锚定行的开头和结尾(在前面添加^,在结尾添加$).



2> Martin Kool..:

这应该工作:

^\d+\s?(\([^\)]+\)\s?)?Z$

虽然没有测试过,但是让我告诉你故障,所以如果还有任何漏洞,他们应该很容易找到:

首先是开始:

^ = beginning of string
\d+ = one or more decimal characters
\s? = one optional whitespace

然后这部分:

(\([^\)]+\)\s?)?

实际上是:

(.............)?

这使得以下内容可选,只有它完全存在

\([^\)]+\)\s?

\( = an opening bracket
[^\)]+ = a series of at least one character that is not a closing bracket
\) = followed by a closing bracket
\s? = followed by one optional whitespace

最终由...组成

Z$

哪里

Z = your constant string
$ = the end of the string



3> Konrad Rudol..:

你可以这样做:

([0-9]+) (\([^)]+\))? Z

但是,这不适用于Y的嵌套parens.嵌套需要递归,这不再是严格规则的(但不含上下文).现代正则表达式引擎仍然可以处理它,虽然有一些困难(反向引用).

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有