【发布时间】: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"?你不希望它是一个字符串吗?
标签: javascript node.js regex