【发布时间】:2011-02-13 02:57:10
【问题描述】:
我有一个具有以下方案的字符串:
VersionNumber.VersionString-VersionNumber.VersionString
这样下面的示例字符串就可以转换成信息数组了:
1. 1.x-2.x => (1, 'x', '2', 'x')
2. 1.2-3.4 => (1, 2, 3, 4)
3. 1.2-3.4-beta5 => (1, 2, 3, '4-beta5')
4. 1.2-beta3-3.4 => (1, '2-beta3', 3, 4)
5. 1.2-beta3-4.5-beta6 => (1, '2-beta3', 4, '5-beta6')
解析的逻辑是:
- 第一个元素是第一个句点之前的所有内容。
- 第二个元素是数字前的连字符之前的所有内容。
- 第三个元素总是以数字开头,并且一直到下一个句点。
- 第四个元素是句号之后的所有内容。
注意事项:
- 第二个元素是任意字符串,但在数字之前永远不会有连字符(例如,
2-3无效,但2-beta4有效)。 - 第三个元素总是以数字开头,并在连字符之后开始。
我已经能够使用以下表达式解析前三个案例:
(.+?).(.+?)-(.+?).(.*)
但我不确定如何修改它以处理案例 4 和 5(当第二个元素包含连字符时)。我想到的两种方法是:
- 修改第二组以匹配紧接在数字前面的连字符之前的所有内容。
- 仅当第一个连字符紧接在非数字字符之前时,修改第二组以匹配所有内容,直到它碰到第二个连字符。
大概第一种方法是正确/最简单的方法,但我正在努力想出正确的正则表达式来表达它。
【问题讨论】:
-
您的方案与解析步骤 3 的逻辑不匹配“第三个元素始终以数字开头,并且一直到下一个周期。”你的方案应该是“VersionNumber.VersionString-VersionNumber.VersionString”而不是“VersionNumber.VersionString-VersionNumber-VersionString”
-
是的,但在你的问题中,你的方案是 Number.String-Number-String(错字?),最后一个连字符应该是我认为的句号,这让我有点困惑。
-
@Joe 哦,我明白了。你是对的,这是一个错字。抱歉,我以为你在暗示我的逻辑表明我想要“Number.String-Number-String”。
标签: regex