【问题标题】:Regular expression to verify configuration正则表达式验证配置
【发布时间】:2018-09-05 22:36:55
【问题描述】:

我正在尝试用 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));

但它没有按预期工作。请让我知道如何解决上述问题,我计划通过使用| 拆分它们来将此模式匹配到每个字符串表达式以验证第一个示例。

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

【问题讨论】:

  • . 只匹配一个字符。
  • 我只想要一个左括号(因此我尝试使用 .(
  • 我对正则表达式完全陌生,并试图通过避免编写自己的逻辑来验证这个表达式来探索它
  • 你应该首先使用类似 regex101.com 的东西。它不支持 Java 风格,但例如Python 正则表达式非常相似。
  • 当然。我会试试的。谢谢

标签: java regex pattern-matching


【解决方案1】:

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

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

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

接下来,(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-] 后跟任何内容(*)的任意组合,然后尝试

"(\\([a-zA-Z0-9]+, [a-zA-Z0-9-]*.\\)(( \\| )|$))+"

这意味着,分解它:

  1. 一对:一个或多个 a-zA-Z0-9 后跟 , 后跟零个或多个 a-zA-Z0-9- 后跟任何东西 (.)。这些被() 包围。

  2. 一对后面可以跟|(需要转义|,因为它表示逻辑或)或行尾($)。

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

【讨论】:

  • 该对的第二个条目是带有 - 的字母数字,并且它也可以具有类似 abcd-123* 的内容,这表明它可以包含以 abcd-123 开头的任何值。如果我可以为 (abc123, abcd-123*) 提出一个模式,那么我可以使用相同的模式编译每一对。我将使用管道分割整条线,然后应用该模式来验证每一对。
  • @MLS 这不是我展示的吗? [a-zA-Z0-9-] 是带有破折号的字母数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多