【问题标题】:Javascript regular expression to search a string in word having multiple special characters (non space)Javascript正则表达式在具有多个特殊字符(非空格)的单词中搜索字符串
【发布时间】:2018-07-12 16:29:13
【问题描述】:

要求是查找搜索字符串是否存在于具有以下条件的给定字符串中。

条件一 搜索字符串应该在单词的开头,即前面没有特殊字符。

  • abc 应匹配以abc 开头的字符串,例如abcdef 句子中的任何位置。

  • abc 不应匹配 xabcdef 不应匹配,因为它不是以 'abc' 开头的

条件2如果字符串前面有一些特殊字符,那么它也应该在特殊字符之前有一些文本。

  • abc 应该匹配 test_abcdef - 因为 'abc' 前面有 'test_'

  • abc 不应匹配 _abcdef - 因为它以 '_' 开头,而 _ 之前没有任何文本

如果字符串在字符串test@_abcdeftest__abcdef 中有多个 特殊字符ex,则下面的正则表达式找不到abc

在正则表达式中不确定如何在 '(?' 中添加量词 where [^A-Za-z0-9] 正在检查单个非字母数字字符。

在reqex (?<=... )中添加0个或多个特殊字符的语法是什么

正则表达式尝试Online Regex Tester

/^(?<![^A-Za-z0-9])abc|(?<=[A-Za-z0-9][^A-Za-z0-9])abc|(?<=\ )abc/g

示例文本:

abcdef abcdef _abcdef xabcdef test_abcdef test__abcdef abc

【问题讨论】:

  • 就像其他任何地方一样:(?&lt;=(whateverHere)*) * 是 0 或更多。
  • @zenoo (?&lt;=([A-Za-z0-9][^A-Za-z0-9])*)abc(?&lt;=[A-Za-z0-9]([^A-Za-z0-9])*)abc 抛出消息:** * 后视中的量词使其宽度不固定**,但与模式不匹配
  • 您需要捕捉还是仅仅匹配?
  • @anubhava,是的,这两种情况都需要匹配。
  • @julio,它应该匹配并将使用 exec 和 index 找到突出匹配的位置。

标签: javascript regex


【解决方案1】:

您可以在此处应用所有断言而无需交替:

/(?<![a-z0-9])(?<!^[^a-z0-9])(?<!\s[^a-z0-9])abc/igm

RegEx Demo

这个正则表达式在匹配abc之前有3个断言:

  1. (?&lt;![a-z0-9]): 前一个字符不是字母数字时匹配失败
  2. (?&lt;!\s[^a-z0-9]):当我们有一个非字母数字字符且前面没有一些非空格字符时,匹配失败。
  3. (?&lt;!^[^a-z0-9]): 当我们在行开头有一个非字母数字字符时匹配失败

另请注意,Javascript 中的后向支持仍仅限于新浏览器。

【讨论】:

  • 它不匹配(突出显示)regex101.com 中的任何 abc,因为对于 regex 有一些警告
  • 它说“模式错误”(?:向后断言必须是固定宽度)向后断言必须是固定宽度
  • 如果您点击第二个演示链接:regex101.com/r/ptunIX/2,您会注意到这个正则表达式的速度有多快。与接受答案中的 682 步相比,这需要 169 步,此外此正则表达式也正确匹配 abc_abcabc
【解决方案2】:

由于正则表达式不允许可变长度的后视断言,我认为您不能只匹配“abc”,但同时丢弃“_abc”“__abc”“___abc”、“____abc”等内容。

我建议分两步完成:

首先,尝试使用正则表达式匹配所有必需的情况,而不要限制自己只匹配 'abc'

(?:(?!abc[^a-zA-Z0-9\s]+)[a-zA-Z0-9]+[^a-zA-Z0-9\s]+|^|\s)(abc)

https://regex101.com/r/bAo05D/3

然后,只需重新计算 abc 索引:abc_index = whole_regexp_index + length(regexp_matched_string) - length(abc)

【讨论】:

  • 更新为匹配 abc_abc 为 index = 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 2017-11-20
  • 2022-11-16
  • 1970-01-01
相关资源
最近更新 更多