文章目录
前言
在字符串形式的正则表达式中,需要对反斜杠进行转义!!!,最近用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# 用的@ 不用转义