正则表达式:如何检测空格和单引号? [关闭]

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() 用单引号替换反斜杠和单引号

PCI 合规性正则表达式检测带空格的模式

正则表达式选择所有不在引号中的空格?

如何使用正则表达式从引号之间提取包含所需字符串的组? [关闭]

php用正则表达式怎么取双引号里面的内容??

正则表达式用于在不被单引号或双引号包围时使用空格分割字符串