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

相关推荐
十秒耿直拆包选手19 分钟前
web:js提示框、询问框、输入框的使用
开发语言·javascript
朝九晚五ฺ42 分钟前
【MySQL基础】MySQL事务详解:原理、特性与实战应用
数据库·mysql
天天向上的鹿茸1 小时前
web前端用MVP模式搭建项目
前端·javascript·设计模式
唐大爹1 小时前
my2sql-binlog闪回测试
mysql·my2sql·binlog闪回
山河木马2 小时前
前端学C++可太简单了:导入标准库
前端·javascript·c++
胡gh2 小时前
线程与进程:从零开始理解它们的区别与联系
前端·javascript·后端
精神小伙2号2 小时前
vue的provide和inject
前端·javascript·vue.js
爬山算法2 小时前
MySQL(140)如何解决外键约束冲突?
数据库·mysql
JohnYan2 小时前
Bun技术评估 - 18 Bun 1.2(下)
javascript·后端·bun
草履虫建模2 小时前
若依框架下前后端分离项目交互流程详解
java·前端·javascript·spring boot·spring cloud·intellij-idea·交互