【发布时间】:2014-05-16 15:17:42
【问题描述】:
我一直在尝试使用正则表达式来解析命令,以度过美好的一天。
我几次接近解决方案,但总是有一点点把事情搞砸了。
我试图保持表达式的通用性,因为我想在不同的命令上使用它,尽管参数的数量是相同的。
我基本上最多有4个捕获组:
- Number1(单块,无空格)
- Number2(单块,无空格,可选)
- 参数1
- Param2(可选)
Number1 和 Number2 由“-”分隔(= 可选,没有“-”没有 Number2)
Number1 (+ Number2) 和 Param1 用空格分隔(= 必填)
Param1 & Param2 用空格隔开(= 可选)
所以命令的基本布局是:
[编号1]-[编号2] [参数1] [参数2]
以下是可以预期的示例输入列表:
123456A789C 测试
- Number1 = 123456A789C
- Number2 = 未捕获
- Param1 = 测试
- Param2 = 未捕获
123456.789C-987654Z321Y 测试
- Number1 = 123456.789C
- Number2 = 987654Z321Y
- Param1 = 测试
- Param2 = 未捕获
123456.789C 测试1 测试2
- Number1 = 123456.789C
- Number2 = 未捕获
- Param1 = 测试1
- Param2 = test2
123456.789C-987654Z321Y 测试1 测试2
- Number1 = 123456.789C
- Number2 = 987654Z321Y
- Param1 = 测试1
- Param2 = test2
我设法为上述示例编写了一个正则表达式,因为它们相当简单。 然而,我突然想到 Param1 和 Param2 可以是句子。 所以我们决定,如果 Param1 或 Param2 包含空格,则应将它们封装在引号(“)之间 然而,我们仍然希望允许输入不带引号的单字数据,因此引号成为可选的。
1-2 "test1" "test2" 也可以输入为 1-2 test1 test2
1-2 "test1 test2" " test2 test3"不能输入为1-2 test1 test2 test3 test4
示例输入:
123456.789C-987654Z321Y "test1 test2" "test3 test4"
- Number1 = 123456.789C
- Number2 = 987654Z321Y
- Param1 = test1 test2 (注意如何不捕获引号)
- Param2 = test3 test4 (注意如何不捕获引号)
这就是我无法让我的正则表达式正常工作的地方。 一旦我开始将某些部分设为可选,它的行为就不会像我希望的那样。
以下正则表达式是我想出的符合大多数情况的:
(?i)^(?<numbers>(?<number1>[^\s]*?)(?:[-](?<number2>[^\s]*?))?)\s(?<params>("?)(?<param1>[^"]*)\1\s("?)(?<param2>[^"]*)\2)$
但是不接受 1 test, 1-2 test, 1 "test", 1-2 "测试”,1“测试测试”,1-2“测试测试”
一些正则表达式专家可以在这里帮助我并解释我的表达哪里出错了吗?
这是我用来匹配最完整命令的另一个正则表达式,例如 1-2 "test1 test2" "test3 test4"
(?i)^(?<numbers>(?<number1>.*)-(?<number2>.*))\s(?<params>"(?<param1>[^"]*)"\s"(?<param2>[^"]*)")$
【问题讨论】: