正则表达式:如何检测空格和单引号? [关闭]
Posted
技术标签:
【中文标题】正则表达式:如何检测空格和单引号? [关闭]【英文标题】:Regular Expresions: How to detect white spaces and single quotes? [closed] 【发布时间】:2022-01-23 04:22:54 【问题描述】:我开发了这个函数,如果字符串完成正则表达式,则返回 True,否则返回 False。
const validChars = (str) =>
return /^[a-zA-Z]+$/.test(str);
;
如果我想验证像巴塞罗那或马德里这样的字符串,这个函数可以正常工作。但是如果我想验证像“Bordes d'Envalira”或“Barcelona”或“El Pas de la Casa”这样的真字符串是行不通的。
为了解决这个问题,我修改了我的函数以接受空格和单引号。现在的函数是这样的:
const validChars = (str) =>
return /^['\s|a-zA-Z]+$/.test(str);
;
这个正则表达式在 https://regex101.com/ 中可以正常工作,但在 javascript 中不行。你可以在https://regex101.com/看到结果
这怎么可能?我做错了什么?
编辑我:
也许说我正在使用 node.js 很重要。这个错误是在服务器端产生的。
我已将我的功能修改为:
const validChars = (str) =>
return /^['\sa-zA-Z]+/.test(str);
;
它不适用于“El Pas de la Casa”和“Bordes d'Envalira”
编辑二:
这些是我的测试。工作鳍 5 和 2 失败。
mport getData from "../com/functions";
import config from "../config";
describe("Test of predictive text from Front-end", () =>
describe ("Test of predictive test is not correct", () =>
test("Test 1: Number of chars is less than 5", async () =>
let word = "word";
let params =
"place": word,
"origin": "Front-end"
;
let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/predictive`, params);
//console.log(result.data);
expect(result.data.result).toBe("KO");
);
test("Test 2: Some char received is not valid", async () =>
let params =
"place": 1,
"origin": "Front-end"
;
let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/predictive`, params);
//console.log(result.data);
expect(result.data.result).toBe("KO");
);
test("Test 3: Som char is a number", async () =>
let params =
"place": "Barce1ona",
"origin": "Front-end"
;
let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/predictive`, params);
//console.log(result.data);
expect(result.data.result).toBe("KO");
);
test("Test 4: String with only numbers", async () =>
let params =
"place": "12345",
"origin": "Front-end"
;
let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/predictive`, params);
//console.log(result.data);
expect(result.data.result).toBe("KO");
);
test("Test 5: String with a single quote", async () =>
let params =
"place": "Bordes d'Envalira",
"origin": "Front-end"
;
let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/predictive`, params);
console.log(result.data);
expect(result.data.result).toBe("OK");
);
test("Test 6: String with not valid char", async () =>
let params =
"place": "Bordes d#Envalira",
"origin": "Front-end"
;
let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/predictive`, params);
console.log(result.data);
expect(result.data.result).toBe("KO");
);
test("Test 7: String with white spaces", async () =>
let params =
"place": "El Pas de la Casa",
"origin": "Front-end"
;
let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/predictive`, params);
console.log(result.data);
expect(result.data.result).toBe("OK");
);
);
describe("Test of predictive test is correct", () =>
);
);
对服务器的调用有这样的代码:
router.post("/api/predictive", (req, res) =>
let result = null;
console.log(req.body.place);
if ((req.body.place.length >= 5) && (typeof(req.body.place) !== "string") && (validChars(req.body.place)))
result = new Result("OK");
else
result = new Result("KO");
if (req.body.place.length < 5)
result.set_message("The length of place is less than 5");
if (typeof(req.body.place) !== "string")
result.set_message("The type of data is not a string");
if (!validChars(req.body.place))
console.log(req.body.place);
result.set_message("There are invalid chars. We only accept alphabtic chars");
console.log(result);
res.json(result);
);
【问题讨论】:
在[]
块内,|
字符实际上不被视为“或”。
/^['\s|a-zA-Z]+$/.test("Bordes d'Envalira")
返回true
。你怎么打电话给validChars
?
/^['\sa-zA-Z]+/.test("Bordes d'Envalira")
是true
。我不明白您是如何从validChars()
看到false
的。你能向我们展示一个示例代码块,其中validChars()
给出了false
?
这里也一样。我在节点 v14.13.0 中编写了一个小程序,对于这两个字符串,我得到了 true
:"El Pas de la Casa"
和 "Bordes d'Envalira"
。无法重现问题。
你为什么要检查typeof(req.body.place) !== "string"
?你不希望它是一个字符串吗?
【参考方案1】:
看来您需要将!==
更改为===
。
改变这个:
if ((req.body.place.length >= 5) && (typeof(req.body.place) !== "string") && (validChars(req.body.place)))
到这里:
if ((req.body.place.length >= 5) && (typeof(req.body.place) === "string") && (validChars(req.body.place)))
当validChars()
是字符串而不是字符串时,您想调用它。
仅供参考,您可以将语法简化为:
if (req.body.place.length >= 5 && typeof req.body.place === "string" && validChars(req.body.place))
【讨论】:
【参考方案2】:我认为这种情况下的问题是 '\s' 匹配换行符和回车符以及空格。
试试下面那个
const validChars = (str) =>
return /^[ 'a-zA-Z]+$/.test(str);
;
【讨论】:
以上是关于正则表达式:如何检测空格和单引号? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式使用 postgres regexp_replace() 用单引号替换反斜杠和单引号