JS-在字符串形式的正则表达式中,需要对反斜杠进行转义

文章目录


前言

在字符串形式的正则表达式中,需要对反斜杠进行转义!!!,最近用AI帮我转换代码,后端伙伴已经用C#的正则方法。结果被坑了一波。下面娓娓道来。


一、转换前

后端用C#写的判断方法,我就拿过来,想着最近用的AI大模型转换代码挺牛的。当然我用的是免费的国内的版本,而且测试了其他几个国内的免费版本,有些是能正确转译的。

C#代码:

json 复制代码
 public bool CheckXXXNum(xxType xxx, string xxxNum)
    {
        switch (xxx)
        {
            case xxx:
                if (!Regex.IsMatch(xxxNum, @"^(\d{12}|\d{22})$"))
                {
                    return false;
                }
                break;

            default:
             
        }

二、转换后

用AI帮我转换后第二个"//d" 一开始帮我转换成d. 导致匹配不到。没细看的结果报错了,还好测试发现了。所以这里查了相关知识记录下。

json 复制代码
// 辅助函数,使用第三方正则表达式库进行匹配
function match(value: string, pattern: string): boolean {
  const regex = new RegExp(pattern)
  return regex.test(value)
}

export function checkXxNum(
  x: xxType | string,
  xxxNum: string
): boolean {
  switch (xxx) {
    case xxx:
      return match(xxxNum, '^(\\d{12}|\\d{22})$')
  }
}

三、相关知识

在JavaScript中,使用构造函数 new RegExp(pattern) 的方式创建正则表达式时,pattern 参数应该是一个字符串,这个字符串内容就是正则表达式的模式。在字符串中表示正则表达式的模式时,确实需要使用双反斜杠 \\ 来转义特殊字符,包括反斜杠自身。

例如,如果你想创建一个匹配\d(任何数字)的正则表达式,由于\d在正则表达式中是一个特殊序列,表示匹配数字,但在字符串中编写\d时,需要对\进行转义,于是你得写成\\d。因此,构造函数的使用方式如下:

javascript 复制代码
let regex = new RegExp("\\d");

或者,如果你想要创建一个全局匹配数字的正则表达式,需要添加修饰符g,则模式字符串应该是:

javascript 复制代码
let regex = new RegExp("\\d", "g");

模板字符串

使用模板字符串创建一个匹配数字的正则表达式,依然写为:

json 复制代码
let pattern = `\\d`; // 匹配任何单个数字
let regex = new RegExp(pattern);

四 regExp(正则表达式)

参考 MDN正则表达式

字面量和构造函数

有两种方法可以创建一个 RegExp 对象:一种是字面量,另一种是构造函数。

字面量

由斜杠 (/) 包围而不是引号包围。

构造函数的字符串参数

由引号而不是斜杠包围。

以下三种表达式都会创建相同的正则表达式:

js 复制代码
/ab+c/i; //字面量形式
new RegExp("ab+c", "i"); // 首个参数为字符串模式的构造函数
new RegExp(/ab+c/, "i"); // 首个参数为常规字面量的构造函数

五,C#的@ 不用双斜杆

在C#中,字符串前加上 @ 符号用来创建一个所谓的"verbatim(逐字)字符串字面量"。这种字符串允许你几乎完全按照字面意义来编写字符串内容,也就是说,除了字符串结束的引号(")之外,所有字符都不需要转义。

当在正则表达式中使用 @ 定义字符串时,由于字符串变为逐字字符串字面量,大多数情况下你不需要对特殊字符如反斜杠(\)进行转义。因此,正则表达式中的 \d 直接写作 \d 而不是 \\d\w 就是 \w,依此类推。

例如,下面的C#代码展示了如何使用 @ 来定义一个正则表达式字符串,而无需对其中的反斜杠进行转义:

csharp 复制代码
string pattern = @"^\d+$"; // 匹配一个或多个数字组成的字符串
bool isMatch = Regex.IsMatch(inputString, pattern);

在这个例子中,@ 前缀使得我们直接使用 \d+ 而不需要双反斜杠,因为字符串中的每一个字符都会被当作普通字符对待,除非它是引号(表示字符串结束)或另一个特殊字符 $(在本例中用于正则表达式的结尾匹配)。这样简化了正则表达式的编写,减少了因转义问题引起的错误。

总结

简而言之,在字符串中,单个反斜杠是转义字符,所以需要再加一个来表示字面意义上的反斜杠。这样,正则表达式引擎才能正确解析你的模式字符串。而C# 用的@ 不用转义

相关推荐
清灵xmf34 分钟前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询
eternal__day1 小时前
MySQL_聚合函数&分组查询
数据库·mysql
薛一半2 小时前
PC端查看历史消息,鼠标向上滚动加载数据时页面停留在上次查看的位置
前端·javascript·vue.js
咕哧普拉啦2 小时前
乐尚代驾十订单支付seata、rabbitmq异步消息、redisson延迟队列
java·spring boot·mysql·spring·maven·乐尚代驾·java最新项目
过期的H2O22 小时前
【H2O2|全栈】JS进阶知识(四)Ajax
开发语言·javascript·ajax
MarcoPage2 小时前
第十九课 Vue组件中的方法
前端·javascript·vue.js
你好龙卷风!!!3 小时前
vue3 怎么判断数据列是否包某一列名
前端·javascript·vue.js
春哥的魔法书3 小时前
数据库基础(5) . DCL
数据库·mysql
鬼才血脉4 小时前
docker+mysql配置
mysql·adb·docker
一个假的前端男4 小时前
mysql 安装 windows
数据库·mysql