寻找一个正则表达式字符串,它可以让我找到嵌入字符串中的最右边(如果有)数字组。我们只关心连续的数字。我们不关心标志,逗号,小数等。如果发现这些,应该只是像字母一样被视为非数字。
这是为了替换/递增目的,所以我们还需要获取检测到的数字之前和之后的所有内容,这样我们可以在递增值后重建字符串,这样我们就需要一个标记化的正则表达式。
以下是我们正在寻找的例子:
作为我们想要的一个例子,它就像从名称'Item 4-1a'开始,在作为前缀之前提取出所有内容的'1'以及作为后缀后的所有内容。然后使用它,我们可以在代码循环中生成值“Item 4-2a”,“Item 4-3a”和“Item 4-4a”。
现在如果我正在寻找第一套,这很容易。我只是找到第一个连续的0个或更多前缀的非数字块,然后是数字的1个或多个连续数字块,那么到目前为止的其他所有内容都将是后缀。
我遇到的问题是如何将前缀定义为包括除最后一组之外的所有(如果有)数字。我尝试使用前缀的所有内容都会吞下最后一组,即使我已经尝试通过基本上颠倒上述内容来将其锚定到最后。
答案 0 :(得分:13)
怎么样:
^(.*?)(\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*)$
答案 1 :(得分:6)
尝试下一个正则表达式:
(\d+)(?!.*\d)
说明:
(\d+) # One or more digits.
(?!.*\d) # (zero-width) Negative look-ahead: Don't find any characters followed with a digit.
编辑(问题的OFFTOPIC)::这个答案是不正确的但是这个问题已经在其他帖子中得到了回答,所以为了避免删除这个,我将使用相同的正则表达式,例如Perl
中的C#
可以像s/(\d+)(?!.*\d)/$1 + 1/e;
一样获得相同的结果(增加最后一位数字):
{{1}}
答案 2 :(得分:3)
您也可以尝试更简单的版本:
(\d+)[^\d]*$
答案 3 :(得分:1)
这应该这样做:
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);
答案 4 :(得分:1)
如何不使用正则表达式。这是代码片段(用于控制台)
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();