【发布时间】:2014-05-17 08:29:18
【问题描述】:
我想使用正则表达式来验证这样的字符串:
foo.bar=123.baz=456.qux=789.urr
(其中123、456 和789 是占位符任意数字,但foo、bar、baz、qux 和urr 是文字文本而不是占位符。我需要单独捕获bar/baz/qux 的值,所以我使用命名捕获组。
问题在于bar=a、baz=b 和qux=c 完全是可选的,可以按任意顺序出现。所以我的正则表达式需要接受这些为有效:
foo.urr
foo.bar=123.urr
foo.qux=123.bar=456.urr
foo.baz=123.bar=456.qux=789.urr
...但将这些视为无效而拒绝:
foo.bar=123.bar=456.urr
foo.qux=123.baz=456.qux=789.urr
我的正则表达式代码现在是这样的:
const String Bar = @"(?<bar>bar=(\d)+)";
const String Baz = @"(?<baz>baz=(\d)+)";
const String Qux = @"(?<qux>qux=(\d)+)";
const String Regex = @"^foo\.((" + Bar + "|" + Baz + "|" + Qux + @")\.)*urr$";
我的表达式使用* 来允许可选的Bar、Baz 和Qux 命名组以任意顺序出现,但它也允许它们出现多次,这是不允许的。
我知道我可以使用 n! 表达式对其进行暴力破解,但将来这些元素的数量可能会随着时间的推移而增加,并且无法进行硬编码。
更新:
我本来可以在我原来的问题中使用一个更好的例子,但是 bar、baz 和 qux 的值都有自己的子表达式,例如bar 接受十六进制数字,baz 接受十进制数字,qux 只接受字母字符,所以这是无效的:
foo.bar=zzz.baz=aaa.qux=123.urr
【问题讨论】:
-
您是否有理由不能使用多个正则表达式模式和一些简单的逻辑?或者实际上是一个以
xxx=000形式捕获所有内容的正则表达式,然后检查是否在代码中不重复字符串? -
@BenAaronson 我可以,但这会大大增加复杂性。您能否举例说明我将如何以可管理的方式使用该方法?
-
它可能会使代码(在正则表达式之外)更复杂,但同时它会使正则表达式更容易。不要忘记正则表达式也必须被解析/应用。它不像是一条指令,只是因为代码中只有一行。
-
foo.bar=123.xxx=456.urr是否无效(xxx变量不在列表中)? -
@UlugbekUmirov 是的,这是无效的,因为名称只能是
bar、baz或qux。