JavaScript中两个字符串的匹配

工作中遇到一个问题,两个字符串匹配,要求:每个字符串中最多含有一个*,?可以无限多个

*代表一个任意长度的字符串,而?则代表一个字符

要求可以提示出两个冲突

<input type="text" id="str1"><br>
<input type="text" id="str2"><br>
<input type="button" οnclick="checkMarchX()" value="CHECK">

用Javascript实现代码如下:

function checkMarchX()
	{
		var str1 = document.getElementById('str1').value;
		var str2 = document.getElementById('str2').value;
		var str1XPosition = str1.indexOf('*');
		var str2XPosition = str2.indexOf('*');
		if(str1XPosition!=-1 && str2XPosition!=-1)//两者都含有*
		{
			var position = str1XPosition>str2XPosition?str2XPosition:str1XPosition;//success
			if(position!=0)
			{
				var patbeforeStr1 = str1.substring(0,position);
				var patbeforeStr2 = str2.substring(0,position);
				if(checkMarchQ(patbeforeStr1,patbeforeStr2))
				{
					//alert(str1+'与'+str2+"前半部分冲突");
					//然后对应后半部分进行测试
					var str1XBackPosition = str1.length-str1XPosition-1;
					var str2XBackPosition = str2.length-str2XPosition-1;
					var backposition = str1XBackPosition>str2XBackPosition?str2XBackPosition:str1XBackPosition;
					if (backposition==0)
					{
						alert(str1+'与'+str2+"冲突");
					}
					else
					{
						var patbackStr1 = str1.substring(str1.length-backposition,str1.length);
						var patbackStr2 = str2.substring(str2.length-backposition,str2.length);
						if(checkMarchQ(patbackStr1,patbackStr2))
						{
							alert(str1+'与'+str2+"冲突");
						}
					}
				}
			}
			else
			{
				//alert(str1+'与'+str2+"前半部分冲突");
				var str1XBackPosition = str1.length-str1XPosition-1;
				var str2XBackPosition = str2.length-str2XPosition-1;
				var backposition = str1XBackPosition>str2XBackPosition?str2XBackPosition:str1XBackPosition;
				if (backposition==0)
				{
					alert(str1+'与'+str2+"冲突");
				}
				else
				{
					var patbackStr1 = str1.substring(str1.length-backposition,str1.length);
					var patbackStr2 = str2.substring(str2.length-backposition,str2.length);
					if(checkMarchQ(patbackStr1,patbackStr2))
					{
						alert(str1+'与'+str2+"冲突");
					}
				}
			}
		}
		else if((str1XPosition==-1 && str2XPosition!=-1)||(str1XPosition!=-1 && str2XPosition==-1))//有且只有一个字符串含有*
		{
			var strX = str1XPosition==-1?str2:str1;//含有*的字符串
			var strNoX = str1XPosition==-1?str1:str2;//不含*的字符串
			if (strX.length-1<strNoX.length)
			{
				var position = strX.indexOf('*');
				if(position==0)
				{
					//alert(str1+'与'+str2+"前半部分冲突");
					var backposition = strX.length-position-1;
					if (backposition==0)
					{
						alert(str1+'与'+str2+"冲突");
					}
					else
					{
						var patbackStr1 = str1.substring(str1.length-backposition,str1.length);
						var patbackStr2 = str2.substring(str2.length-backposition,str2.length);
						if(checkMarchQ(patbackStr1,patbackStr2))
						{
							alert(str1+'与'+str2+"冲突");
						}
					}
				}
				else
				{
					var patbeforeStr1 = str1.substring(0,position);
					var patbeforeStr2 = str2.substring(0,position);
					if(checkMarchQ(patbeforeStr1,patbeforeStr2))
					{
						//alert(str1+'与'+str2+"前半部分冲突");
						var backposition = strX.length-position-1;
						if (backposition==0)
						{
							alert(str1+'与'+str2+"冲突");
						}
						else
						{
							var patbackStr1 = str1.substring(str1.length-backposition,str1.length);
							var patbackStr2 = str2.substring(str2.length-backposition,str2.length);
							if(checkMarchQ(patbackStr1,patbackStr2))
							{
								alert(str1+'与'+str2+"冲突");
							}
						}
					}
				}
			}
		}
		else
		{
			if(checkMarchQ(str1,str2))
			{
				alert(str1+'与'+str2+"冲突");
			}
		}
	}
	function checkMarchQ(str1,str2)
	{
		var flagque = false;
		if(str1.length==str2.length)
		{
		    //长度相同才有可能冲突
			for (var i=0 ;i<str1.length ;i++ )
			{
				if(str1.substr(i,1)!='?' && str2.substr(i,1)!='?')
				{
					if(str1.substr(i,1)!=str2.substr(i,1))
					{
						flagque = false;//表示不冲突
						break;
					}
					else
					{
						flagque = true;//表示冲突
					}
				}
			}
		}
		return flagque;
	}

其中*最起码为一个字符,以上程序并没有对输入的合法性进行验证


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值