JavaScript中两个字符串的匹配


Posted in Javascript onJune 08, 2016

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

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

要求可以提示出两个冲突

<input type="text" id="str1"><br>

<input type="text" id="str2"><br>

<input type="button" onclick="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;
}

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

查看更多JavaScript的语法,大家可以关注:《JavaScript 参考教程》、《JavaScript代码风格指南》,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript读取RSS数据
Jan 20 Javascript
学习javascript,实现插入排序实现代码
Jul 31 Javascript
js仿百度贴吧验证码特效实例代码
Jan 16 Javascript
js sort 二维数组排序的用法小结
Jan 24 Javascript
JavaScript采用递归算法计算阶乘实例
Aug 04 Javascript
详解JavaScript操作HTML DOM的基本方式
Oct 21 Javascript
深入浅析JavaScript中with语句的理解
May 12 Javascript
jQueryUI中的datepicker使用方法详解
May 25 Javascript
JavaScript Base64 作为文件上传的实例代码解析
Feb 14 Javascript
jQuery EasyUI window窗口使用实例代码
Dec 25 jQuery
谈谈我在vue-cli3中用预渲染遇到的坑
Apr 22 Javascript
vue-cli3配置favicon.ico和title的流程
Oct 27 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
Jun 08 #Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
Jun 08 #Javascript
玩转JavaScript OOP - 类的实现详解
Jun 08 #Javascript
Javascript之String对象详解
Jun 08 #Javascript
浅谈JavaScript函数的四种存在形态
Jun 08 #Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
Jun 08 #Javascript
关于session和cookie的简单理解
Jun 08 #Javascript
You might like
模仿OSO的论坛(五)
2006/10/09 PHP
PHP JSON格式数据交互实例代码详解
2011/01/13 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
php创建多级目录的方法
2015/03/24 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
javascript取消文本选定的实现代码
2010/11/14 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
JavaScript内核之基本概念
2011/10/21 Javascript
js取滚动条的尺寸的函数代码
2011/11/30 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
python之import机制详解
2014/07/03 Python
Python中bisect的用法
2014/09/23 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
Python属性和内建属性实例解析
2020/01/14 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
PHP经典面试题
2016/09/03 面试题
关键字final的用法
2013/10/02 面试题
关于.NET, HTML的五个问题
2012/08/29 面试题
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
导游词之昭君岛
2020/01/17 职场文书
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android
redis 解决库存并发问题实现数量控制
2022/04/08 Redis