【问题标题】:Regex for matching HashTags in any language用于匹配任何语言的 HashTag 的正则表达式
【发布时间】:2022-05-20 06:24:09
【问题描述】:

我的应用程序中有一个字段,用户可以在其中输入主题标签。 我想验证他们的输入并确保他们输入了正确的 HashTag。 它可以是任何语言,并且应该以#号开头。 我正在用 JavaScript 编写代码。

所以以下是很好的例子:

  • Abcde45454_fgfgfg(很好,因为:只有字母、数字和 _)
  • 2014_is-the-year(很好,因为:只有字母、数字、_ 和 -)
  • בר_רפאלי(很好,因为:只有字母和_)
  • арбуз(很好,因为:只有字母)

以下是不好的例子:

  • Dan Brown(不好,因为有空格)
  • 天啊!!!!!! (因为有!)
  • בר רפ@לי(不好,因为有 @ 和空格)

我们有一个仅匹配 a-zA-Z0-9 的正则表达式,我们需要添加语言支持,因此我们将其更改为忽略空格并忘记忽略特殊字符,所以我来了。

我看到的其他一些 StackOverflow 示例但对我不起作用:

  1. Other languges don't work
  2. Again, English only

[编辑]

  • 添加了为什么坏就是坏,好就是好的解释
  • 我不想要前面的 # 字符,但如果我想在开头添加 #,它应该是一个有效的主题标签
    • 基本上我不想允许任何特殊字符,例如 !@#$%^&*()=+./,[{]};:'"?>

【问题讨论】:

  • 你的坏例子不包含#。那么你的禁忌字符到底是什么?
  • 编辑了我的问题以添加解释和更多信息。谢谢!
  • 所以前面#是允许的,虽然你不喜欢,而#在其他地方是禁止的,是吗?
  • 不,我不想让 # 在文本中的任何位置出现,我希望它是多语言中的有效主题标签短语。
  • JavaScript 正则表达式不支持 Unicode 字符类。

标签: javascript regex multilingual hashtag


【解决方案1】:

如果您的禁止字符列表是完整的 (!@#$%^&*()=+./,[{]};:'"?><),那么正则表达式是:

^#?[^\s!@#$%^&*()=+./,\[{\]};:'"?><]+$

Demo

这允许一个可选的前导 # 符号:#?。它不允许使用否定字符类的特殊字符。我刚刚将\s 添加到列表(空格)中,并且我还转义了[]

不幸的是,您不能在 JavaScript 的正则表达式中使用 \p{P}(Unicode 标点符号)之类的结构,因此如果正则表达式解决方案不足以满足您的需求,您基本上必须将字符列入黑名单或采取不同的方法。

【讨论】:

  • 由于 OP 与(扩展)ASCII 集之外的字符匹配,因此您的建议将匹配该集之外的许多特殊字符(授予,由 OP 定义错误)。
  • @Bart 当然,我在最后一段中对此提出警告。我能想到的唯一 JS 正则表达式解决方案需要添加 Unicode 范围(如[\u2000-\u206F])。这留给 OP 练习 ;)
  • 不完全确定你们在这里的意思。 @Lucas 你的回答确实非常适合我。如果有一种不那么丑陋的方法(同时仍然满足我的所有需求),我会很高兴听到它!感谢您的努力
  • @PoOoZaQ 我们的意思是有一种 more 丑陋的方法来做到这一点,因为这个答案没有考虑到每个应该被禁止的字符......例如,¶¿§‼ 是一个有效的主题标签。但是考虑到它会很痛苦,因为您必须在黑名单中添加更多字符:例如,这个正则表达式:^#?[^\s!@#$%^&amp;*()=+./,\[{\]};:'"?&gt;&lt;\u2000-\u206F]+$ 会使我之前的 ¶¿§‼ 示例不匹配。如果没有像 JS 中的 \p{P} 这样的结构,您必须将所有 Unicode 范围添加到字符类的黑名单中。
  • 注意:\p{L} 和所有字符属性都在 XRegExp 中可用。
【解决方案2】:

我不明白为什么这个问题没有得到更多的选票。多种语言的标签检测是一个问题。我能找到的唯一可行的选项是 Lucas 上面发布的(所有其他选项都不太好用)。

它需要修改:

#[^\s!@#$%^&*()=+.\/,\[{\]};:'"?><]+

DEMO

这会检测所有主题标签,不仅在字符串的开头,修复未转义的字符,并在最后删除不必要的$

【讨论】:

  • 这错误地接受了#123。似乎没有一个主要的社交网络允许只使用数字标签。
  • @ceejayoz Instagram 仅支持数字标签
【解决方案3】:

首先,如果我们排除所有符号,这不是一个方便的解决方案。因为符号取决于键盘布局,并且有数百个数学符号等等。所以用这个..

[\p{sc=孟加拉语}|\p{L}_\p{N}]+

1. 如果您认为语言是否需要额外注意,包括 \p{sc=Bengali}|\p{sc=Spanish} 等。假设孟加拉语有 া、ে ৌ 等替代字母所以代码点需要先通过 \p{sc=Bengali}

分别识别孟加拉语

2. 比使用 \p{L} 匹配任何 Unicode 字母 a-z 和 é,ü,ğ,i,ç 等字母或普通任何不复杂的字母...匹配“字母”类别中的单个代码点

3.允许_下划线

4. \p{N} 匹配任何脚本中的任何类型的数字字符。 (\d 仅匹配一个数字(等于 [0-9]),但对于允许的 Unicode 数字 \p{N} 仅选项,因为它适用于任何数字代码点)

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多