javascript - 使用正则表达式的字符串中相似字符的唯一序列
问题描述
我有一些测试字符串:
- “X”
- “ 毫米 ”
- “×毫米”
- “年×毫米”
- “xx 毫米 y 毫米”
我想制作一个应该匹配字符串 1、2、3、4 但不匹配 5 的正则表达式。
所以我对匹配的限制是:
- 一个字母序列应该在字符串中出现一次。(例如,“y”是一个 y 的序列,“yy”是两个 y 的序列,但它们包含相同的字母,因此它们是矛盾的,不能同时出现)
- 字符串中只允许使用特定的字母(对于我的情况是“xym”)。
- 任何序列都可以出现在字符串的开头、中间或结尾。但是,如果另一个字母序列分别在它之前或之后,则应以非单词字符为前缀或后缀。
- 不一定所有字母序列都必须出现在字符串中。
注意:- 我只想要一个正则表达式来解决这个问题。因为使用单独的正则表达式和迭代我已经完成了。我正在寻找单行解决方案来验证我的字符串。
我尝试过的解决方案是:
/(?=^[xym\W]+$)((?=^([^m]*\W)?m+(\W[^m]*)?$)|(?=^([^x]*\W)?x+(\W[^x]*)?$)|(?=^([^y]*\W)?y+(\W[^y]*)?$))/
但它也匹配第 5 种情况。
解决方案
您可以使用
/^(?!.*\b([xym])\1*\b.*\b\1+\b)(?:\s*\b([xym])\2*\b)*\s*$/
请参阅正则表达式演示。
细节
^
- 字符串的开始(?!.*\b([xym])\1*\b.*\b\1+\b)
- 如果在字符串开始后立即出现匹配失败的负前瞻.*
- 除换行符以外的任何 0+ 个字符,尽可能多\b([xym])\1*\b
- 由相同字符、x
、y
或m
.*
- 除换行符以外的任何 0+ 个字符,尽可能多\b\1+\b
- 由第 1 组中捕获的字符组成的整个单词
(?:\s*\b([xym])\2*\b)*
- 0次或多次重复\s*
- 0 个或更多空白字符\b([xym])\2*\b
- 由 1 个或多个相同字符组成的整个单词x
,y
或m
\s*
- 0 个或更多空白字符$
- 字符串结束。
推荐阅读
- php - laravel select2 on submit 接收空白页
- java - 如何在 Android Studio 中更改排序包/文件?
- php - MySQL "SELECT `setting`, `value` FROM `phpauth_config`" 混淆
- enums - 使用 Elixir pipeine 和 Enum 将数据放入列表中
- macos - 如何在我的 Mac 上知道我的最新操作系统更新
- python - 使用多处理模块时如何打印字符串?
- excel - 如何使一个单元格中的硬编码值与并行单元格中的值一起移动
- javascript - 错误:匿名调用者没有 storage.objects.get 访问 Google Cloud Storage 对象的权限
- python - Plotly 中的地图上的散点饼图或 Python 中的 Bokeh
- visual-studio-code - 在 windows 下的 vscode 中的 kedro 项目中运行 jupyter lab 是不可能的