我不认为在每种情况下都有可能,但这里有一些技巧可以用于您的示例:
@"(?m)^(?=(?<firstValue>\d+\b))(?:\k<firstValue>, *)?(?<secondValue>\d+)\r?$"
第一个数字在 group 中被捕获firstValue
,但由于 group 在前瞻内,匹配位置随后返回到字符串的开头。如果有第二个数字,第一个数字将紧跟逗号。(?:\k<firstValue>, *)?
尝试使用数字、逗号和任何尾随空格,并(?<secondValue>\d+)
捕获第二个数字。
如果只有一个数字,则不(?:\k<firstValue>, *)?
消耗任何内容,这没关系,因为它是可选的。这使得匹配位置仍然在字符串的开头,因此(?<secondValue>\d+)
再次捕获第一个数字,这次是在 group 中secondValue
。我们还没有尝试在 group 中添加任何其他内容firstValue
,所以这个数字也仍然存在。
这是另一种不太优雅但可能更容易理解的方法:
@"(?m)^(?<secondValue>(?<firstValue>\d+))(?:, *(?<secondValue>\d+))?\r?$"
与其他响应者的解决方案基本相同,但我从捕获两组中的第一个数字开始。如果证明有第二个数字,它将被捕获到 group 中secondValue
,覆盖已经存在的值。组firstValue
仍然包含第一个数字。