RegEx字符串将查找字符串中最后一组(最右边)数字
本文关键字:字符串 一组 右边 数字 查找 最后 RegEx | 更新日期: 2023-09-27 18:19:27
寻找一个正则表达式字符串,它可以让我找到嵌入字符串中最右边的一组数字(如果有的话)。我们只关心连续的数字。我们不在乎符号、逗号、小数等。如果发现这些,就应该像字母一样简单地视为非数字。
这是为了替换/递增的目的,所以我们还需要获取检测到的数字前后的所有内容,这样我们就可以在递增值后重建字符串,所以我们需要一个标记化的正则表达式。
以下是我们正在寻找的示例:
- "abc123def456ghi"应标识"456"
- "abc123def456ghi789jkl"应标识"789"
- "abc123def"应标识"123"
- "123ghi"应识别"123"
- "abc123456ghi"应识别"456"
- "abc-654def"应标识"654"
- "abcdef"不应返回任何匹配项
作为我们想要的一个例子,它将类似于从名称"项目4-1a"开始,提取出前缀前所有内容和后缀后所有内容的"1"。然后使用它,我们可以在代码循环中生成值"项目4-2a"、"项目4-3a"和"项目4-4a"。
现在,如果我在寻找第一盘,这会很容易。我只会为前缀找到第一个0个或更多非数字的连续块,然后为数字找到1个或更多连续数字的块,然后结尾的所有其他部分都是后缀。
我遇到的问题是如何将前缀定义为包括除最后一组之外的所有(如果有的话)数字。我为前缀所做的一切都会吞噬最后一组,即使我试图通过基本上颠倒上述内容将其锚定到最后。
怎么样:
^(.*?)('d+)('D*)$
然后递增第二组,并将所有3都凹入。
解释:
^ : Begining of string
( : start of 1st capture group
.*? : any number of any char not greedy
) : end group
( : start of 2nd capture group
'd+ : one or more digits
) : end group
( : start of 3rd capture group
'D* : any number of non digit char
) : end group
$ : end of string
第一个捕获组将匹配所有字符,直到字符串结束前最后一组数字的第一位。
或者您是否可以使用命名组
^(?<prefix>.*?)(?<number>'d+)(?<suffix>'D*)$
尝试下一个正则表达式:
('d+)(?!.*'d)
说明:
('d+) # One or more digits.
(?!.*'d) # (zero-width) Negative look-ahead: Don't find any characters followed with a digit.
<小时>编辑(问题的主题)::这个答案不正确,但这个问题已经在其他帖子中得到了回答,所以为了避免删除这个问题,我将以其他方式使用相同的正则表达式,例如在Perl
中可以这样使用,以获得与C#
相同的结果(最后一位递增):
s/('d+)(?!.*'d)/$1 + 1/e;
小时>您也可以尝试更简单的版本:
('d+)[^'d]*$
这应该做到:
Regex regexObj = new Regex(@"
# Grab last set of digits, prefix and suffix.
^ # Anchor to start of string.
(.*) # $1: Stuff before last set of digits.
(?<!'d) # Anchor start of last set of digits.
('d+) # $2: Last set of one or more digits.
('D*) # $3: Zero or more trailing non digits.
$ # Anchor to end of string.
", RegexOptions.IgnorePatternWhitespace);
不使用Regex怎么样。以下是代码片段(用于控制台)
string[] myStringArray = new string[] { "abc123def456ghi", "abc123def456ghi789jkl", "abc123def", "123ghi", "abcdef","abc-654def" };
char[] numberSet = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
char[] filterSet = new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z','-'};
foreach (string myString in myStringArray)
{
Console.WriteLine("your string - {0}",myString);
int index1 = myString.LastIndexOfAny(numberSet);
if (index1 == -1)
Console.WriteLine("no number");
else
{
string mySubString = myString.Substring(0,index1 + 1);
string prefix = myString.Substring(index1 + 1);
Console.WriteLine("prefix - {0}", prefix);
int index2 = mySubString.LastIndexOfAny(filterSet);
string suffix = myString.Substring(0, index2 + 1);
Console.WriteLine("suffix - {0}",suffix);
mySubString = mySubString.Substring(index2 + 1);
Console.WriteLine("number - {0}",mySubString);
Console.WriteLine("_________________");
}
}
Console.Read();