Javascript 模式到模式列表
实际上,我有这样一个例子,我必须验证是否存在重叠模式(可能是正则表达式或其他东西) 我相信这里的重叠匹配是Javascript 模式到模式列表,javascript,c#,regex,pattern-matching,Javascript,C#,Regex,Pattern Matching,实际上,我有这样一个例子,我必须验证是否存在重叠模式(可能是正则表达式或其他东西) 我相信这里的重叠匹配是“123?”,“123*”和“*23*” 通配符对于任何尾随字符限制为“*”,对于任何1个长度限制为“?” 顺便说一句,这是用于数字格式的,因此也可以在数字模式/格式中包含文字破折号(最多) 这可以通过正则表达式或其他方法实现吗?如果可能,使用C#/Javascript 请对我错过的任何信息发表评论 TIA现在只想分享我的解决方案,但这是通过C#实现的 静态字符串重新填充(字符串输入) {
“123?”
,“123*”
和“*23*”
通配符对于任何尾随字符限制为“*”
,对于任何1个长度限制为“?”
顺便说一句,这是用于数字格式的,因此也可以在数字模式/格式中包含文字破折号(最多)
这可以通过正则表达式或其他方法实现吗?如果可能,使用C#/Javascript
请对我错过的任何信息发表评论
TIA现在只想分享我的解决方案,但这是通过C#实现的
静态字符串重新填充(字符串输入)
{
返回inp.Replace(“*”,“*”)。Replace(“?”,“.”)。Replace(“-”,@“\-”);
}
静态字符串重新填充2(字符串输入)
{
返回inp.Replace(“*”,“*”)。Replace(“?”,“.”)。Replace(“-”,”);
}
静态void Main()
{
变量模式=新字符串[]{“8888*”、“8889*”、“8888*”、“8899*”、“8988*”、“8989*”、“8989*”、“8999*”、“7898*”、“7899*”、“8888-8*”、“88*”;
字符串ar=@“888?-*”;
List res=新列表();
布尔mat1,mat2;
Regex reg1、reg2;
foreach(模式中的var reg)
{
reg1=新的正则表达式(regRep(reg));
reg2=新的Regex(regep(ar));
mat1=reg1.IsMatch(ar);
mat2=reg2.IsMatch(reg);
//标准匹配
if(mat1 | | mat2)
{
res.Add($“{ar}std与{reg}匹配”);
}
其他的
{
//强制匹配
reg1=新的Regex(regRep2(reg));
reg2=新的Regex(regRep2(ar));
mat1=reg1.IsMatch(ar);
mat2=reg2.IsMatch(reg);
if(mat1 | | mat2)
{
res.Add($“{ar}frc与{reg}匹配”);
}
}
}
}
//结果
计数=5
[0]:“888?-*frc与8888*匹配”
[1] :“888?-*frc与8889*匹配”
[2] :“888?-*frc与8888?8匹配”
[3] :“888?-*std与888?-8匹配”
[4] :“888?-*std与*88*匹配”
现在这个对我来说很有用,我希望有人也会,如果不是的话,更好。谢谢 你好,我无法理解你想要实现的目标。请详细说明。我想你需要具体说明你想涵盖多少语法;如果我们限制在
?*.
,这是可行的,但是如果你进入复杂的前瞻和捕获组,这将很难做到。@KenY-N嗨Kenny,我想我只限于8位数字或最多带破折号的数字格式,所以对于通配符和其他东西,我只限于长度的星号和问号?
在12?
?@revo中的意思是什么?我刚刚编辑过,希望它能进一步澄清问题
string pattern = "123*"
string[] patterns = new string[] { "123?", "123*", "12?", "*23*" }
static string regRep(string inp)
{
return inp.Replace("*", ".*").Replace('?', '.').Replace("-", @"\-");
}
static string regRep2(string inp)
{
return inp.Replace("*", ".*").Replace('?', '.').Replace("-", ".");
}
static void Main()
{
var patterns = new string[] { "8888*", "8889*", "8898*", "8899*", "8988*", "8989*", "8989*", "8999*", "7898*", "7899*", "8888?8", "888?-8", "*88*" };
string ar = @"888?-*";
List<string> res = new List<string>();
bool mat1, mat2;
Regex reg1, reg2;
foreach (var reg in patterns)
{
reg1 = new Regex(regRep(reg));
reg2 = new Regex(regRep(ar));
mat1 = reg1.IsMatch(ar);
mat2 = reg2.IsMatch(reg);
// standard matching
if (mat1 || mat2)
{
res.Add($"{ar} std matched with {reg}");
}
else
{
//forced matching
reg1 = new Regex(regRep2(reg));
reg2 = new Regex(regRep2(ar));
mat1 = reg1.IsMatch(ar);
mat2 = reg2.IsMatch(reg);
if (mat1 || mat2)
{
res.Add($"{ar} frc matched with {reg}");
}
}
}
}
//result
Count = 5
[0]: "888?-* frc matched with 8888*"
[1]: "888?-* frc matched with 8889*"
[2]: "888?-* frc matched with 8888?8"
[3]: "888?-* std matched with 888?-8"
[4]: "888?-* std matched with *88*"