我有下一个正则表达式:
^\s*(\d+(\s*,\s*\d+)*)?\s*$
匹配下一个字符串:
“1,2,3”
我需要修改它以匹配具有一个特定单词的下一个字符串(忽略大小写):
“1,myword,3”
“myword,2,3”
“1,myword,3,myword”
如何添加其他支票组?
更新:Myword是可选的,可以重复几次或者在字符串的开头。
答案 0 :(得分:1)
首先,您的原始正则表达式可以简化为^\s*((\d+|myword)\s*,\s*)*\(d+|myword)$
,为了处理您想要的扩展程序,可以将其修改为{{1}}。
答案 1 :(得分:1)
您可以将\d+
替换为(?:\d+|myword)
。看看Alternation with The Vertical Bar or Pipe Symbol:
如果您要搜索文字文本
cat
或dog
,请使用竖线或竖线符号分隔这两个选项:cat|dog
。如果您想要更多选项,只需展开列表:cat|dog|mouse|fish
。
要告诉正则表达式引擎我们只想替换\d+
数字和myword
,我们将它们放在non-capturing group内,仅用于分组目的。
见
^\s*((?:\d+|myword)(\s*,\s*(?:\d+|myword))*)?\s*$
请参阅regex demo。
要对MyWoRd
不区分大小写,请在编译RegexOptions.IgnoreCase
对象时使用Regex
标记,或在整个模式前添加(?i)
内联修饰符 (即(?i)^\s*((?:\d+|myword)(\s*,\s*(?:\d+|myword))*)?\s*$
)。
以下是C# demo:
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
var inputs = new string[] { "1, 2, 3", "1, myword, 3", "1, MyWord, 3" };
var pat = @"^\s*((?:\d+|myword)(\s*,\s*(?:\d+|myword))*)?\s*$";
foreach (var s in inputs)
Console.WriteLine("{0} matched: {1}", s, Regex.IsMatch(s, pat, RegexOptions.IgnoreCase));
}
}