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 相关文章推荐
鼠标右击事件代码(asp.net后台)
Jan 27 Javascript
jQuery新闻滚动插件 jquery.roller.js
Jun 27 Javascript
JS代码防止SQL注入的方法(超简单)
Apr 12 Javascript
fullCalendar中文API官方文档
Feb 07 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
Apr 01 jQuery
vue.js实例对象+组件树的详细介绍
Oct 20 Javascript
微信小程序自定义导航栏
Dec 31 Javascript
JavaScript常见继承模式实例小结
Jan 11 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
Sep 21 Javascript
js实现图片实时时钟
Jan 15 Javascript
用js编写留言板
Mar 17 Javascript
js canvas实现五子棋小游戏
Jan 22 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
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
php格式文件打开的四种方法
2018/02/24 PHP
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
javascript innerText和innerHtml应用
2010/01/28 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
p5.js入门教程和基本形状绘制
2018/03/15 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
在Chrome DevTools中调试JavaScript的实现
2020/04/07 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
Python for Informatics 第11章之正则表达式(四)
2016/04/21 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
什么是Python变量作用域
2020/06/03 Python
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
党的群众路线教育实践活动自我剖析材料
2014/10/08 职场文书
辞职信的写法
2015/02/27 职场文书
Win11怎么修改电源模式?Win11修改电源模式的方法
2022/04/05 数码科技
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技