正则表达式最常用的几种情形

本文深入探讨正则表达式在判断、寻找与替换文本中的应用,通过实例展示如何使用正则表达式处理常见字符串操作,如验证数字输入、查找数字串及格式化输出。

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

正则表达式提供了一种字符串匹配模式的描述形式,通过简单的符号就能表达丰富的文本结构。如 [a-z]+ 就可以表示所有字母的组合。

以下是在实际项目中使用得最多的三种情形。

1 判断

如判断用户的输入是否符合要求。通常使用正则表达式的 test 方法,当传入的字符串符合正则表达式的模式要求时会返回 true。

如仅允许输入数字,可用以下方法检测:

function checkNum(inputStr){
    return /^\d+$/.test(inputStr);
}

其中正则表达式 ^\d+$ 中,第一个符号 ^ 表示字符串首,最后的 $ 表示字符串尾,加上这两个表示必须整串字符完全跟模式匹配才返回 true。而如果没有,则只要字符串中包含符合模式的串就会返回 true。

2 寻找

在文本中寻找指定形式的匹配串,如手机号、邮箱等。在 javascript 中,通常可以使用字符串对象的 match 方法。此时,正则表达式作为 match 方法的参数传入。

如,找出文本中所有的数字串:

function findNum(inputStr){
    return inputStr.match(/\d+/g);
}

// 调用示例
console.log( findNum("a123abb90,78a909").join() );

上边调用示例会输出匹配的数组数据:123,90,78,909
正则表达式 \d+ 表示数字串,而表达式对象 /\d+/ 外的 g 是一个选项,表示全局搜索,表明要找出所有的匹配项。如果没有这个 g,则只会返回第 1 个匹配结果。

此外,也可以使用正则表达式的 exec 方法,匹配第 1 个符合模式的字符串。如 /\d+/.exec("a123abb90,78a909") 得到 123

当然,如果文本中不包括匹配的内容则会返回 null。

3 替换

将文本中符合指定模式的匹配串替换成别的字符串,使用字符串的 replace 方法。如,将上边示例字符串中的非数字部分替换成逗号,这种情形在对用户输入时去除干扰性输入时经常用到。

function replaceNotNum(inputStr){
    return inputStr.replace(/[^\d]+/g, ",");
}

// 调用示例
console.log( replaceNotNum("a123abb90,78a909") );

上边调用示例会输出结果:,123,90,78,909
同样,正则表达式后边的 g 表示全局,如果没有它,则只会替换掉第 1 个匹配的字符串。

有一种情形是替换时经常碰到的:对匹配的内容不是替换成另一个相同的字符串,而是在匹配的基础上进行调整。如将上边示例字符串中的连续数字统一加上中括号。此时可以:

function decorateNum(inputStr){
    return inputStr.replace(/(\d+)/g, '[$1]');
}

// 调用示例
console.log( decorateNum('a123abb90,78a909') );

上边调用示例会输出结果:a[123]abb[90],[78]a[909]
正则表达式 ([\d]+) 加了括号,而替换的字符串中出现了一个$1,这是关键。因为替换的内容跟匹配的内容需要动态关联,需要一种关联机制。这种机制就是,括号中的内容作为子匹配会进行存储,以供后续使用,一共支持 $1 ~ $9共 9 个存储值,这里再举一个例子。

function exchangeNum(inputStr){
    return inputStr.replace(/(\d)(\d)/g, '$2$1');
}

猜猜以下调用会输出什么结果:

console.log( exchangeNum('12 34 56 78') );

4 语法文档

至于想要匹配的内容如何书写正则表达式,这与需求相关,可以在面临实际问题时去翻阅语法说明或其它方式寻求答案。

参考文档:https://www.runoob.com/regexp/regexp-tutorial.html

### L1正则化与L2正则化的定义 L1正则化和L2正则化是机器学习中常用的两种正则化方法,用于防止模型过拟合并提升泛化能力。L1正则化基于1-范数的概念,在损失函数中加入权重绝对值之和作为惩罚项[^1]。其数学形式如下: ```python Loss_L1 = Loss_original + λ * Σ|w_i| ``` 其中 `λ` 是正则化参数,控制正则化强度;`Σ|w_i|` 表示权重的绝对值之和。 相比之下,L2正则化基于2-范数的概念,通过在损失函数中增加权重平方和的形式来实现正则化[^3]。具体表达式为: ```python Loss_L2 = Loss_original + λ/2 * Σ(w_i^2) ``` 这里的 `λ/2` 同样表示正则化强度,而 `Σ(w_i^2)` 则代表权重平方的总和。 --- ### 正则化的作用 无论是L1还是L2正则化,它们的核心作用都是通过对模型权重施加约束,从而降低复杂度并避免过拟合现象的发生。然而,两者的实际效果存在显著差异。 #### L1正则化的特点 L1正则化的一个突出特点是能够生成稀疏解,这意味着它会将部分不重要的特征对应的权重压缩至零[^2]。这种特性使其非常适合于高维数据中的特征选择任务,因为它能有效剔除无关紧要的变量,进而简化模型结构并增强解释性。 此外,由于L1正则化倾向于忽略噪声较大的样本点,因此具备较好的抗噪性能。 #### L2正则化的优势 不同于L1正则化追求稀疏性的策略,L2正则化更注重平滑分布权重值,使各特征的重要性更加均衡。这种方法不会直接消除任何单一特征的影响,而是通过缩小整体权重规模达到抑制过拟合的目的。 值得注意的是,随着现代深度学习技术的发展,L2正则化因其良好的数值稳定性和高效优化表现,逐渐成为主流应用之一。 --- ### 两者的主要区别 以下是L1正则化与L2正则化之间几个关键方面的对比总结: 1. **目标导向** - L1正则化旨在构建稀疏解决方案,适合处理冗余特征较多的数据集。 - L2正则化致力于均匀分配权重资源,适用于需要保留全部输入信息的情形。 2. **几何意义** - 在参数空间内,L1正则化对应着菱形轮廓线,容易触及坐标轴形成零权重组件。 - 而L2正则化呈现圆形边界形状,促使所有方向上的分量均有所缩减而非完全消失。 3. **适用场景** - 当面临大量潜在无用属性时,优先考虑采用L1正则化来进行内置筛选操作。 - 若希望维持原始维度不变同时改善稳定性,则推荐运用L2正则化手段。 4. **计算成本** - 实现过程中发现,相较于单纯依赖梯度下降算法更新规则而言,引入L1正则化可能带来额外运算负担因需频繁判断阈值条件。 - 反观之下,L2正则化通常仅涉及简单的乘法累加过程因而相对简便快捷一些。 --- ### 结论 综上所述,尽管二者同属正则化范畴且共享预防过度匹配这一共同使命,但在机制设计、应用场景等方面各有侧重。合理选取恰当类型的正则化措施对于终建模成果至关重要。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值