首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >匹配正则表达式进行规范化

匹配正则表达式进行规范化
EN

Stack Overflow用户
提问于 2020-09-11 16:33:06
回答 3查看 79关注 0票数 2

非常糟糕的正则表达式,所以在这里寻求帮助我写的函数是接受一个输入,并返回规范化的输出,所以输入必须匹配,而不是列出所有可能的组合,有什么方法可以使用RegExp吗?

例如jackjill | jack-jill | jack - jill | jack&jill | jack-&-jill | jack- and -jill | jackandjill | jack -and- jill | jack n jill |...,函数将返回'Jack & Jill‘

因此,input.match(/jack -&n*jill/)涵盖了空格-,n,但是‘input.match’又如何呢?

EN

回答 3

Stack Overflow用户

发布于 2020-09-11 16:39:21

您可以使用可选的字符类扩展模式,并使用|扩展alternation

代码语言:javascript
运行
复制
\bjack(?:[ &-]+|[ -]?(?:and|n)[ -]?)?jill\b

Regex demo

如果nand之前和之后的内容应该是相同的,您可以对前面的part使用捕获组,并使用反向引用来匹配它之后的相同内容。

代码语言:javascript
运行
复制
\bjack(?:[ &-]+|([ -]?)(?:and|n)\1)?jill\b

说明

  • \bjack单词边界,然后匹配jack
  • (?:非捕获组
    • [ &-]+匹配空格、&或1
    • (?:and|n)可选地匹配捕获组中的空格或反向引用与组1

中捕获的内容匹配and-

关闭组并使ik optional

  • jill\bjill匹配,后跟单词边界

Regex demo

票数 0
EN

Stack Overflow用户

发布于 2020-09-11 20:32:50

你可以用\bjack.*?jill\b代替jack[ -&n]*jill

详细信息

  • .*?:jack和jill
  • \b:word

之间的任意字母

Demo

票数 0
EN

Stack Overflow用户

发布于 2020-09-12 04:11:23

使用

代码语言:javascript
运行
复制
replace(/\b(jack)[\s&-]*(?:(?:n|and)[\s&-]*)?(jill)\b/gi, '$1 & $2')

参见proof

*解释

代码语言:javascript
运行
复制
--------------------------------------------------------------------------------
  \b                       the boundary between a word char (\w) and
                           something that is not a word char
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    jack                     'jack'
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  [\s&-]*                  any character of: whitespace (\n, \r, \t,
                           \f, and " "), '&', '-' (0 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (optional
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    (?:                      group, but do not capture:
--------------------------------------------------------------------------------
      n                        'n'
--------------------------------------------------------------------------------
     |                        OR
--------------------------------------------------------------------------------
      and                      'and'
--------------------------------------------------------------------------------
    )                        end of grouping
--------------------------------------------------------------------------------
    [\s&-]*                  any character of: whitespace (\n, \r,
                             \t, \f, and " "), '&', '-' (0 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )?                       end of grouping
--------------------------------------------------------------------------------
  (                        group and capture to \2:
--------------------------------------------------------------------------------
    jill                     'jill'
--------------------------------------------------------------------------------
  )                        end of \2
--------------------------------------------------------------------------------
  \b                       the boundary between a word char (\w) and
                           something that is not a word char

JavaScript:

代码语言:javascript
运行
复制
const text = " jackjill | jack jill | jack-jill | jack&jill | jack & jill | jack-&-jill | jack and jill | jackandjill | jack-and-jill | jack n jill jack knows Jill";
console.log(text.replace(/\b(jack)[\s&-]*(?:(?:n|and)[\s&-]*)?(jill)\b/gi, '$1 & $2'));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63843547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档