需求
项目有个 graphql 查询语句,我简化了一下,场景如下
abcd  efgh{1234}
abcd  efgh  {1234}
abcd efgh :{1234}
需要拿到 abcd efgh 1234
- 第一行中 efgh{1234}中efgh和{之间没有空格
- 第二行 efgh{1234}中efgh和{之间有两个空格
- 第三行 abcdefgh之间有一个空格,efgh和{之间有冒号和空格
技巧
匹配可能存在的值
正则用 xxx? 去匹配可能存在的值,如下面一堆数据中 efg 可能不存在
[ :]*? 表示匹配空格和冒号,但是空格和冒号可能不存在
捕获组并命名分组
正则用 (?<name>xxx) 去捕获组,组名为 name,xxx 为正则表达式
(?<one>\w+) 表示匹配英文字符串,这是一个捕获组,组名 one
题解
表达式为 (?<one>\w+) *?(?<two>\w+)[ :]*?{(?<three>\w+)}
const regex = /(?<one>\w+) *?(?<two>\w+)[ :]*?{(?<three>\w+)}/;
const str = `abcd  efgh{1234}`;
str.match(regex).groups;
返回
{
  "one": "abcd",
  "two": "efgh",
  "three": "1234"
}
踩到的一些坑
js 中正则表达式加了 gm 参数的时候,str.match(regex),返回了一个数组,没有捕获组
const regex = /(?<one>\w+) *?(?<two>\w+)[ :]*?{(?<three>\w+)}/gm;
const str = `abcd  efgh{1234}`;
str.match(regex);
返回
['abcd  efgh{1234}', 'abcd', 'efgh', '1234'];
后记
我正则很菜,期间群友 pomo 和 德巨 提供了不少帮助
pomo:用 xxx? 去匹配可能存在的值
德巨:直接给出了题解,我学习了匹配技巧
这篇文章只记录了简单的技巧,我的场景还是比较复杂的,大致如下
query xxxxTest ($path: xxxxTestInputPath) {
query xxxxTest ($path: xxxxTestInputPath)  {
query xxxxTest ($path: xxxxTestInputPath){
query xxxxTest ($path:xxxxTestInputPath) {
匹配语句如下
(query) *(\w+) \((\$\w+) *: *(\w+) *\)( *){
参考文章
不错的参考文章,网站有点搓,别挂了,,我哪天有时间全抄过来