咨询个前端正则问题

2 天前
 ymz

1 、问题

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

2 、GPT 回答

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

3 、如何处理

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

1157 次点击
所在节点    程序员
14 条回复
kyuuseiryuu
2 天前
老老实实枚举非法字符吧。
ymz
2 天前
@kyuuseiryuu 走黑名单,非法字符太多了
codehz
2 天前
/[\p{L}\p{N}\.\-&:]/gmu 看看这样行不行
fredsunme
2 天前
const pattern = /[^\w\s\.\-\&\u4e00-\u9fa5\u0600-\u06FF\u00C0-\u024F\u00E0-\u00FC]/; 这个呢
zhhbstudio
2 天前
要么列所有合法字符,要么列所有非法字符。
gpt 在注释里给你写了,他没列出 中文、阿拉伯语和西班牙语的字母,你加上就行
zed888
2 天前
pattern = re.compile(r'^[\w\s\u4e00-\u9fff\u0600-\u06ff\u00c0-\u017f\.\-\&\:]*$')
clandyuki
2 天前
/^[\u4e00-\u9fa5\u0600-\u06FFa-zA-Z0-9.\-&:áéíóúñÁÉÍÓÚÑ\s]+$/
试试?
NoManPlay
2 天前
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
2 天前
等,所以还有什么其他
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
2 天前
三楼用 unicode general category 的方法应该可行,但 Number 大类下有很多奇怪字符,不知道你对这些的定义算不算符号,具体可以对照文档细调分类
https://unicode.org/reports/tr18/#General_Category_Property
longlonglanguage
2 天前
使用白名单不就行了,https://www.shubang.net/unicode/,这个有 unicode 表中文和英文的范围值,你允许使用字符,判断一下范围就行了。
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
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
}
}

`

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1096156

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX