【发布时间】:2012-01-05 12:40:55
【问题描述】:
寻找一个正则表达式字符串,它可以让我找到嵌入在字符串中的最右边(如果有的话)数字组。我们只关心连续的数字。我们不关心符号、逗号、小数等。如果找到这些,应该像字母一样简单地视为非数字。
这是出于替换/递增的目的,因此我们还需要获取检测到的数字之前和之后的所有内容,以便我们可以在递增值后重建字符串,因此我们需要一个标记化的正则表达式。
以下是我们正在寻找的示例:
- “abc123def456ghi”应该识别'456'
- “abc123def456ghi789jkl”应该识别'789'
- “abc123def”应该标识'123'
- “123ghi”应该标识'123'
- “abc123,456ghi”应该识别出'456'
- “abc-654def”应该识别'654'
- “abcdef”不应返回任何匹配项
作为我们想要的示例,它类似于以名称“Item 4-1a”开头,提取前缀之前的所有内容和后缀之后的所有内容的“1”。然后使用它,我们可以在代码循环中生成值“Item 4-2a”、“Item 4-3a”和“Item 4-4a”。
现在,如果我正在寻找第一组,这将很容易。我只是找到前缀的第一个 0 或多个非数字的连续块,然后是数字的 1 个或多个连续数字的块,然后到最后的所有内容都是后缀。
我遇到的问题是如何将前缀定义为包括除最后一组之外的所有(如果有)数字。我为前缀所做的一切尝试都会吞下最后一组,即使我尝试通过基本上颠倒上述方式将其锚定到最后。
【问题讨论】:
-
您可以使用@Birei 提供的正则表达式split 并在连接之前更新第二个索引以获得所需的结果。
-
怎么拆分?如果字符串是 a44b44c 怎么办?前缀应该是“a44b”,如果我要进行太多手动操作,那么使用已经支持命名令牌的正则表达式会失败。
-
通过拆分,我的意思是 (Regex.Split)[msdn.microsoft.com/en-us/library/…,因此是上一条评论中的超链接。应用
Regex.Split()并为a44b44c提供3 个令牌,即。a44b、44和c。 -
啊啊!不知道那个。效果很好!