V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ymz
V2EX  ›  程序员

咨询个前端正则问题

  •  
  •   ymz · 2 天前 · 1158 次点击

    1 、问题

    判断一个字符串中的特殊符号,只有 "."、"-"、"&" 或 ":" 是合法的特殊字符,其他的都是非法特殊字符。同时字符串中的中文、英文、阿拉伯语、西班牙语等都是合法的字符。

    2 、GPT 回答

    咨询 ChatGPT 得到了下面的答案,但是不对:

    3 、如何处理

    有没有前端大佬知道怎么写

    14 条回复    2024-12-10 13:53:27 +08:00
    kyuuseiryuu
        1
    kyuuseiryuu  
       2 天前
    老老实实枚举非法字符吧。
    ymz
        2
    ymz  
    OP
       2 天前
    @kyuuseiryuu 走黑名单,非法字符太多了
    codehz
        3
    codehz  
       2 天前
    /[\p{L}\p{N}\.\-&:]/gmu 看看这样行不行
    fredsunme
        4
    fredsunme  
       2 天前
    const pattern = /[^\w\s\.\-\&\u4e00-\u9fa5\u0600-\u06FF\u00C0-\u024F\u00E0-\u00FC]/; 这个呢
    zhhbstudio
        5
    zhhbstudio  
       2 天前
    要么列所有合法字符,要么列所有非法字符。
    gpt 在注释里给你写了,他没列出 中文、阿拉伯语和西班牙语的字母,你加上就行
    zed888
        6
    zed888  
       2 天前
    pattern = re.compile(r'^[\w\s\u4e00-\u9fff\u0600-\u06ff\u00c0-\u017f\.\-\&\:]*$')
    clandyuki
        7
    clandyuki  
       2 天前
    /^[\u4e00-\u9fa5\u0600-\u06FFa-zA-Z0-9.\-&:áéíóúñÁÉÍÓÚÑ\s]+$/
    试试?
    NoManPlay
        8
    NoManPlay  
       2 天前   ❤️ 1
    const validPattern = /^[\u4E00-\u9FFF\u3400-\u4DBF\u20000-\u2A6DF\u2A700-\u2B73F\u2B740-\u2B81F\u2B820-\u2CEAF\u2CEB0-\u2EBEF\u0041-\u005A\u0061-\u007A\u00C0-\u024F\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\u0870-\u089F\uFB50-\uFDFF\uFE70-\uFEFF\u1EE00-\u1EEFF.\-&:]*$/;

    - \u4E00-\u9FFF 基础汉字
    - \u3400-\u4DBF 汉字扩展 A 区
    - \u20000-\u2A6DF 汉字扩展 B-F 区
    - \u0041-\u005A & \u0061-\u007A 英文字母
    - \u00C0-\u024F 西班牙语及扩展拉丁字符
    - \u0600-\u06FF 阿拉伯语基础块及扩展
    - .\-& 合法的特殊字符
    // utf 字符范围由 gpt 协助提供
    renmu
        9
    renmu  
       2 天前 via Android
    等,所以还有什么其他
    seakee
        10
    seakee  
       2 天前
    ```js
    function checkSpecialCharacters(str) {
    // 允许的特殊字符
    const allowedSpecials = ['.', '-', '&', ':'];

    // 使用正则表达式匹配所有非字母数字的字符
    // \p{L} 匹配任何语言的字母(包括中文、英文、阿拉伯语等)
    // \p{N} 匹配任何数字
    const specialChars = str.match(/[^\p{L}\p{N}]/gu) || [];

    // 存储非法的特殊字符
    const illegalChars = specialChars.filter(char => !allowedSpecials.includes(char));

    return {
    hasIllegalChars: illegalChars.length > 0,
    illegalChars: [...new Set(illegalChars)], // 去重
    isValid: illegalChars.length === 0
    };
    }
    ```
    festoney8
        11
    festoney8  
       2 天前
    三楼用 unicode general category 的方法应该可行,但 Number 大类下有很多奇怪字符,不知道你对这些的定义算不算符号,具体可以对照文档细调分类
    https://unicode.org/reports/tr18/#General_Category_Property
    longlonglanguage
        12
    longlonglanguage  
       2 天前
    使用白名单不就行了,https://www.shubang.net/unicode/,这个有 unicode 表中文和英文的范围值,你允许使用字符,判断一下范围就行了。
    longlonglanguage
        13
    longlonglanguage  
       2 天前
    @longlonglanguage 试了试 chatgpt ,它给写了 python 代码相当 Nice ,就是英文 unicode 的范围你需要删除一些。```Python
    #!/usr/bin/python
    # Write Python 3 code in this online editor and run it.
    char="@"
    # 定义语言的 Unicode 范围
    unicode_ranges = {
    "中文 (CJK Unified Ideographs)": (0x4E00, 0x9FFF),
    "中文 (CJK Extension A)": (0x3400, 0x4DBF),
    "英文 (Basic Latin)": (0x0000, 0x007F),
    "阿拉伯语 (Arabic)": (0x0600, 0x06FF),
    "西班牙语 (Latin-1 Supplement)": (0x0080, 0x00FF),
    }

    def check_language(char):
    """检查字符属于哪个语言范围"""
    code_point = ord(char) # 获取字符的 Unicode 编码点
    for language, (start, end) in unicode_ranges.items():
    if start <= code_point <= end:
    return 1
    return 0

    # 测试
    result = check_language(char)
    print(result)
    ```
    maiminakamiquq
        14
    maiminakamiquq  
       1 天前
    之前好像做过类似的 使用的 Unicode
    `
    validateFunction: (rule, value, data, callback) => {
    const validChars = /^[0-9\u002D\uFF0D\u002C\uFF0C\u3001\u0020\u3000]*$/;
    if (!validChars.test(value)) {
    callback('请输入数字、空格,以及中英文状态下的“-”、“,”、“,”和“、”符号。')
    } else {
    return true
    }
    }

    `
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5581 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 02:37 · PVG 10:37 · LAX 18:37 · JFK 21:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.