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# 用的@ 不用转义

相关推荐
JieE2124 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
冬奇Lab6 小时前
AI Workflow 定义的四次演进:从 Markdown 到 JS 脚本,再到分布式多 Agent
javascript·人工智能·agent
一颗烂土豆12 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl
kyriewen14 小时前
同事每天催我 Code Review,我写了个脚本让 AI 替我 review PR——现在他反过来催 AI 了
前端·javascript·ai编程
weedsfly17 小时前
迭代器、生成器与异步迭代——让数据“按需流动”的艺术
前端·javascript
假如让我当三天老蒯17 小时前
前端跨域解决方案(学习用)
前端·javascript·面试
铁皮饭盒19 小时前
Bun 哪比 Node.js 快?
javascript·后端
JieE2121 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
candyTong1 天前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
_柳青杨1 天前
深入理解 JavaScript 事件循环
前端·javascript