小于三位的正整数 正则式_正则表达式

博客介绍了正则表达式是解决字符串处理问题的利器,阐述了常用元字符、限定符的定义,如d代表整数、*表示出现零次或多次等。还通过IP地址匹配示例说明用法,并给出多个练习题及解答,涉及RegExp对象方法、HTML标签个数计算等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则表达式是解决字符串处理问题的利器,大部分替换、匹配字符串的问题都可以用正则表达式来解决。

正则表达式中常用元字符定义如下:
d 代表整数
B 代表非边界
D 代表非整数
w 是word的缩写,等价于[A-Za-z0-9_](匹配字母、数字、下划线、汉字 )
W匹配任意不是字母、数字、下划线、汉字的字符
s 代表空白字符
S 代表非空白字符
b 代表边界,匹配单词的开始或结束
[^x]代表除了x以外的任意字符
.匹配除换行符以外的任意字符^匹配字符串的开始$匹配字符串的结束

正则表达式中常用限定符定义如下:
*:出现零次或多次
?:出现一次或零次
+:出现一次或多次
{n}:出现n次
{n,}:至少出现n次
{n,m}:出现n次至m次

转义字符倾斜的方向:
而正则表达式的标识符方向为/

如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办?
很简单,你只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)
我们也可以轻松地指定一个字符范围,像[0-9]代表的含意与d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于w(如果只考虑英文的话)

用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。(d{1,3}.){3}d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:d{1,3}匹配1到3位的数字,(d{1,3}.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(d{1,3})。但为不匹配到256.300.888.999这种不可能存在的IP地址,只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)。

练习题:

1、这个表达式的结果是什么,为什么?

/dBDw{2}W{2}sSb/.test('1a_a(& s')

解答:

RegExp 对象方法——

(1)test() 方法用于检测一个字符串是否匹配某个模式.RegExpObject.test(string)
如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。
调用 RegExp 对象 r 的 test() 方法,并为它传递字符串 s,与这个表示式是等价的:(r.exec(s) != null)。

(2)exec() 方法用于检索字符串中的正则表达式的匹配。返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

d B:以整数打头左边界——匹配1
D:非整数 ——匹配a
w:字母或数字或下划线或汉字, {2}代表前面的元字符出现两次——匹配_a
W{2}:非字母数字下划线汉字的字符出现两次——匹配(&
s :空白字符——匹配 空
Sb:以非空白字符结尾-右边界——匹配结尾s

故返回结果为true

2、请写一段代码,计算一个html文档标签个数(开始和结束标签算两个),要求使用到正则表达式匹配。例如以下匹配应该打印出:6

const html = `<div class='test'><b>Hello</b> <i>world!</i></div>`

解答:注意使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。


[]代表集合,^放在方括号中表示非 。

function length(param) {
  var tag = /</?(w+)([^>]*)>/g
  var match, arr = []
  do {
    if (match) arr.push(match)
    match = tag.exec(param)
  } while (match)
  console.log(arr.length)
}
length(html)

拆解</?(w+)([^>]*)>如下:
< ——匹配html文档左标签的<
/? ——匹配/出现零次或一次
(w+) ——匹配字母数字word一次或多次
([^>]*) ——匹配除了>以外的任意字符出现零次或多次,意即匹配下一个>前面的所有字符
> ——匹配>

90bddae106eca99640baf1ad9d19cb01.png

3、写一个函数,将驼峰字符串转换成-分割字符串

解答:正则表达式与String.prototype.replace结合处理字符串问题是非常强大的。$1代表正则表达式()中的引用值。例如:
var re = /(w+)s(w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1"); // 交换一个字符串中两个单词的位置console.log(newstr); // Smith, John

function conversion(str) { 
  return str.replace(/([A-Z])/g, '-$1').toLowerCase() 
}
var camelCase = 'adminMasterList'
console.log(conversion(camelCase))

9c91e1547c56b3d6ff5c65d6d9789060.png

虽然题目没有明说,但是这种题目一定要用正则表达式来解决。使用for循环来处理字符串虽然可以达到相同的效果,但是得分会无限接近于 0。

4、写一段正则要求匹配字符串:字母开头,后面字母数字下划线,长度6-30。

var reg = /^[a-zA-Z]w{5,29}$/
var str1 = 'e234_12'
var str2 = '_123sd'
console.log(reg.test(str1)) // true
console.log(reg.test(str2)) // false

5、解析url参数

解答思路:
(1)传统方式:查找location.search
(2)新API, URLSearchParams

(1)

da1ff477b107a8d1e5e44fcfa53b474c.png

b9e959c72bee9418f82579cef205ae7e.png

26f55c5a06711b2c656276437d35a314.png
function query(name) {
    const search = location.search.substring(1)
    // search: 'a=10&b=20&c=30'
    const reg = new RegExp(`(^|&)${name}=([^&]*)(&|$)`, 'i')
    const res = search.match(reg)
    if(res === null) {
        return null
    }
    console.log(res)
    return res[2]
}
var a = query('a')
console.log(a)

(2)新API, URLSearchParams

function query(name) {
    const search = location.search
    const p = new URLSearchParams(search)
    return p.get(name)
}
var a = query('a')
console.log(a)

ba6496fb3c3eac010fb0458dcd83cf12.png

本文参考应用:

06 正则表达式-慕课专栏​www.imooc.com正则表达式30分钟入门教程​deerchao.cn快速搞定前端JavaScript面试-解析url参数​coding.imooc.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值