正则表达式以验证配置

时间:2018-09-05 22:36:55

标签: java regex pattern-matching

我试图用Java写正则表达式来评估Spring配置文件中定义的配置。

配置类似于

myConfig: (abc123, abcd-123*) | (abc123, xyz-124-321) | (abc111, *)

在上述配置中,*表示它可以有任何东西。

我在()中提到了一对配置参数,它们之间用|隔开。管道(|仅在要定义多个对时使用:( ) | ( )

它应该至少定义一对。像下面这样

myConfig: (abc123, abcd-123*)

我尝试了下面的代码来仅验证(abc123, abcd-123)。如果这可行,那么我可以继续进行复杂的正则表达式以匹配第一个示例。

String regPattern = "^.([a-zA-Z0-9].,[a-zA-Z0-9].)";
String test = "(123,inteasd)";
System.out.println(test.matches(regPattern));

但是它没有按预期工作。请让我知道如何解决上述问题,并且我打算通过使用|拆分每个字符串表达式来验证第一个示例,从而对每个字符串表达式使用此模式匹配。

我可以通过解析字符串并在不使用regex的情况下在java中验证期望的格式来轻松实现此目的。但是我想尝试使用正则表达式,看看使用Java regex是否可以实现。

1 个答案:

答案 0 :(得分:1)

您必须使用Pattern文档。至少,您应该转义()。在您的"(123,inteasd)"示例中,您可以使用

"\\([a-zA-Z0-9]+,[a-zA-Z0-9]+\\)"

这意味着(,然后是任何a-zA-Z0-9中的1个或多个,之后是,,后面是...

接下来,(abc123, abcd-123*)可以类似地由

匹配
"\\([a-zA-Z0-9]+, [a-zA-Z0-9-]+.\\)"

*匹配由.表示的“任何内容”。此外,该对的第二个条目现在允许使用连字符。尚不清楚这些组的确切结构是什么(是[a-zA-z]-[0-9]还是可能的组合?),所以这很笼统。

同样,复杂的(abc123, abcd-123*) | (abc123, xyz-124-321) | (abc111, *)情况很棘手,因为尚不清楚真正的限制是什么,但是如果每对的第二个条目是[a-zA-Z0-9-]的任意组合,然后是任何内容({{1 }}),然后尝试

*

意味着什么,将其分解:

  1. 一对:一个或多个"(\\([a-zA-Z0-9]+, [a-zA-Z0-9-]*.\\)(( \\| )|$))+" ,后跟a-zA-Z0-9,然后是零个或多个,,后跟任何东西(a-zA-Z0-9-)。这些被.(包围。

  2. 可以在一对之后加上)(由于表示逻辑OR,因此必须转义|)或行尾(|)。

  3. 以上所有条件都存在一次或多次。