我有这个小方法来查找字符串中的3位数字并将其递增1。我传入的字符串类型类似于CP1-P-CP2-004-D
和MOT03-C-FP04-003
。
char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
foreach (char c in alphabet)
{
m = Regex.Match(s, @"\d{3}(?=[" + c + "-]|$)");
}
if (m.Success)
{
int i = Convert.ToInt32(m.Value); i += 1;
Console.WriteLine(s + " - " + i.ToString("D3"));
}
else { Console.WriteLine(s + " - No success"); }
编辑:最初我就是这样;测试我的Regex.Match
案例:
Match m = Regex.Match(s, @"\d{3}(?=[A-]|$)");
它与CP1PCP2001A
无关,但是当我更新它并尝试CP1PCP2001C
时,它返回"没有成功",而CP1PCP2001
没有问题。谁能告诉我为什么会这样?
答案 0 :(得分:2)
你试过吗
m = Regex.Match(s, @"\d{3}(?=[A-Z\-]|$)");
[A-Z]
表示它可以是A和Z之间的任何大写字母,因此无需char[] alphabet
,\-
允许您添加' - '作为参数,不会与第一个参数发生冲突。
答案 1 :(得分:1)
从评论中,我们正在寻找"前3位数字(来自右侧)"。这是一个文字实现:
m = Regex.Match(s, @"\d{3}", RegexOptions.RightToLeft);
这比其他答案更容易接受意外的角色。您可以决定您的申请是好还是坏。
答案 2 :(得分:0)
以这种方式重写代码
bool matched = false;
foreach (char c in alphabet)
{
m = Regex.Match(s, @"\d{3}(?=[" + c + "-]|$)");
if (m.Success)
{
int i = Convert.ToInt32(m.Value); i += 1;
Console.WriteLine(s + " - " + i.ToString("D3"));
matched=true;
break;
}
}
if(!matched)
Console.WriteLine(s + " - No success");
更好的方法是不循环并指定要在正则表达式中匹配的char范围
例如
m = Regex.Match(s, @"\d{3}(?=[A-Z\-]|$)");
if (m.Success)
{
int i = Convert.ToInt32(m.Value); i += 1;
Console.WriteLine(s + " - " + i.ToString("D3"));
}
else
Console.WriteLine(s + " - No success");
正则表达式demo here