浅析正则表达式(Python与JavaScript)

最近参加的DeeCamp2019,虽然是一个名为人工智能的暑期夏令营,在算法层面确实可以学到很多,了解前沿知识,但是实际做项目的时候,很多时候都需要前端的知识,比如与产品设计师交流的展示方案(毕竟企业举办的活动),甚至自己的项目环境有时候也是基于JavaScript的(比如我们组,就需要进行强化学习RL的课题,需要JS的仿真环境。。)。于是,,我发现前后端知识,对于一个完整项目发布是那么的重要的。。

步入正题,在学习JS的这几天,总体感受,确实JS整体上比较简单,相比于传统编程语言(Python,C/C++等),通常浏览器就是它的运行环境,毕竟属于WEB必备,是一种超文本标记语言,类型不强,与CSS,HTML并列又相互协作。

var str = "Visit W3School!";
var n = str.search("W3School"); 

var patt = /e/;
patt.test("The best things in life are free!"); 

可以说JS实际上也是认为一切基于对象,并且所有东西操作的时候都是可以自动认为是字符串,而字符串又是每一种编程语言很重要的组成部分。。于是相关方法用的尤其多,在WEB编程领域,二进制编码,字符串的概念要求很强。本人也不是主要搞前端工作的,小白一枚,这一篇博文主要浅析里面很强大实用的功能——正则表达式。

var str="This is an\n antzone good"; 

var reg=/an$/;

console.log(str.match(reg));

IsInstance返回False的时候,JS后面居然不继续执行,歇菜了,但是HTML可以继续做它的工作,两者功能不影响。。另外,还有很多默认的功能与行为,是需要试出来的,JS很多时候都完成自动的功能。。所有 JavaScript 对象都拥有 toString() 方法,JavaScript 自动调用变量的 toString() 函数,当您试图“输出”对象或变量时。。

先看JS中的正则表达式吧。
JS中的正则表达式,居然可以不加引号,虽然也可以接受字符串作为参数,感觉心真大,这种不明确定义类型的字符居然可以直接使用。。类型不强,但是它加了/.../这种东西作为标记,也算是一种弥补吧,但是感觉还是有些反人类。。

类似的还有异常捕获:
程序一:

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
try {
  adddlert("欢迎您,亲爱的用户!");
}
catch(err) {
  document.getElementById("demo").innerHTML = err.message;
}
</script>

</body>
</html>

程序二:

<!DOCTYPE html>
<html>
<body>

<p>请输入 5 到 10 之间的数字:</p>

<input id="demo" type="text">
<button type="button" onclick="myFunction()">检测输入</button>
<p id="p01"></p>

<script>
function myFunction() {
  var message, x;
  message = document.getElementById("p01");
  message.innerHTML = "";
  x = document.getElementById("demo").value;
  try { 
    if(x == "")  throw "是空的";
    if(isNaN(x)) throw "不是数字";
    x = Number(x);
    if(x < 5)  throw "太小";
    if(x > 10)   throw "太大";
  }
  catch(err) {
    message.innerHTML = "输入:" + err;
  }
}
</script>

</body>
</html>

err变量居然自己就可以使用了。。难道是系统内建的全局变量,只能这么理解了,但是我感觉设为一个字符串或者大写的保留变量比较好,不然一下子感觉很懵。。还有就是如果自定义了message,只需要直接输出err就可以,此时不用再去访问err.message了,因为可能自定义的异常只能覆盖到这个程度,即使访问,也只会输出undefined,但居然不报错,JS还可以继续执行后面的语句。。并且JS自动完成了需多功能,但是有时却不是自己希望的,那么就需要试错了,比如:数据类型不严格,JavaScript 将数字存储为 64 位浮点数,但所有按位运算都以 32 位二进制数执行,这之间的转换,呵呵,还可能需要它解释解释。。以及它的一些精度问题,对于整形的不够支持,也是一大难题。不过话说回来,毕竟前端后端WEB开发,不是用来做数值计算的,不需要完成那么多的数学运算,这些东西都可以交给Python或者C/C++来完成,那这样也说得通了。。

参考例子:
https://www.w3school.com.cn/js/js_numbers.asp
https://www.w3school.com.cn/js/js_bitwise.asp
https://www.w3school.com.cn/js/js_errors.asp
(二进制转十进制>>>,自动进行了无符号数对待。。)
https://www.w3school.com.cn/js/js_number_methods.asp
https://www.w3school.com.cn/jsref/jsref_parseInt.asp
https://www.cnblogs.com/xiao-song/p/5812689.html
https://www.cnblogs.com/8080zh/p/9233049.html
https://www.cnblogs.com/winifredaf/p/10012857.html

JS正则表达式具体可以参考:
https://www.w3school.com.cn/js/js_regexp.asp
http://www.softwhy.com/article-54-1.html
Python正则表达式参考:
https://www.runoob.com/python3/python3-reg-expressions.html

其实作为一种编程语言,JS很多功能与Python里面很像,但是可能有些细节实现可能有些不同,比如:match方法,它可以自动进行全字符搜索匹配,在开头或者末尾进行匹配时则需要明确加上^或者$,而Python里面则刚好相反,它默认只进行开头搜索匹配,而全字符搜索需要进行精细的正则表达式,而Search方法两者则没那么大区别。JS里面匹配不到返回null,并且显示为空,而Python则返回None

#!/usr/bin/python3
import re
 
line = "Cats are smarter than dogs"
# .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
 
if matchObj:
   print ("matchObj.group() : ", matchObj.group())
   print ("matchObj.group(1) : ", matchObj.group(1))
   print ("matchObj.group(2) : ", matchObj.group(2))
else:
   print ("No match!!")

这部分可以参考:
https://www.php.cn/js-tutorial-390803.html
https://www.runoob.com/regexp/regexp-syntax.html

注意其中多行匹配的效果,因为编程语言中,空格以及换行通常是需要特殊对待的。

正则表达式作为一个强大但是却又比较繁琐的功能,在一般的作业编程中往往用的较少,但是在WEB搜索,文本字符处理方面则使用较多,具体在使用的时候可以现用现查,类似于快捷键,平时注意常用使用组合就可以了。

网上前端的资料尤其多,更多阅读:
https://www.cnblogs.com/nyist-xsk/p/7563475.html
https://blog.csdn.net/flytiger_ouc/article/details/19699389
https://www.cnblogs.com/liyuanhong/articles/9593985.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值