首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何在这个正则表达式中自己编写一种转义字符?

我如何在这个正则表达式中自己编写一种转义字符?
EN

Stack Overflow用户
提问于 2019-06-14 18:24:20
回答 3查看 35关注 0票数 1

我希望实现一个函数,该函数从一个输入字符串输出相应的字符串,如“str1\str2@str3”:

代码语言:javascript
运行
复制
function myFunc(string) { ... }

然而,对于输入string,只需要有str1str2str3 (带分隔符)都是可选的。为此,我已经编写了一个执行一种拆分的正则表达式。我不能(正常)拆分,因为分隔符是不同的字符,而且str1、str2和str3的顺序也很重要。这和我的regex模式差不多。现在,我很难扩展这个模式,以便您可以通过使用\或@来转义这两个分隔符。

我怎么才能最好地解决这个问题呢?

代码语言:javascript
运行
复制
var strings = [
  'meaning',
  'meaning|description',
  'meaning@id',
  'meaning|description@id',
  '|description',
  '|description@id',
  '@id',
  'meaning@id|description',
  'sub1\\|sub2',
  'mea\\|ning|descri\\@ption',
  'mea\\@ning@id',
  'meaning|description@identific\\|\\@ation'
];

var pattern = /^(\w+)(?:\|(\w*))?(?:\@(\w*))?$/ // works without escaping
console.log(pattern.exec(strings[3]));

因此,对于问题定义,字符串0-3和8-11应该是有效的,其余的则无效。myFunc(strings[3])和应该返回['meaning','description','id']myFunc(strings[8])应该返回[sub1\|sub2,null,null]

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-14 18:32:33

您需要允许\\[|@]在模式中使用\w替换\w模式中的(?:\\[@|]|\w)模式:

代码语言:javascript
运行
复制
var strings = [
  'meaning',
  'meaning|description',
  'meaning@id',
  'meaning|description@id',
  '|description',
  '|description@id',
  '@id',
  'meaning@id|description',
  'sub1\\|sub2',
  'mea\\|ning|descri\\@ption',
  'mea\\@ning@id',
  'meaning|description@identific\\|\\@ation'
];

var pattern = /^((?:\\[@|]|\w)+)(?:\|((?:\\[@|]|\w)*))?(?:@((?:\\[@|]|\w)*))?$/;
for (var s of strings) {
   if (pattern.test(s)) {
     console.log(s, "=> MATCHES");
   } else {
     console.log(s, "=> FAIL");
   }
}

模式细节

  • ^ -字符串启动
  • ((?:\\[@|]|\w)+) -第1组:1或更多次重复\,然后是@|或一个单词字符
  • (?:\|((?:\\[@|]|\w)*))? -匹配1或0次的可选组
    • \| -a | char
    • ((?:\\[@|]|\w)*) - \的第2组:0或更多的重复,后面跟着@|或一个单词字符。

  • (?:@((?:\\[@|]|\w)*))? -匹配1或0次的可选组
    • @ -a @ char
    • ((?:\\[@|]|\w)*)组3: 0或更多次重复\,然后是@|或一个单词字符

  • $ -字符串的末端。
票数 0
EN

Stack Overflow用户

发布于 2019-06-14 18:31:01

我的猜测是,您希望拆分所有字符串,为此,我们可能会在char类中添加这些分隔符,类似于:

代码语言:javascript
运行
复制
([|@\\]+)?([\w]+)

如果我们不这样做,我们可能想这样做的验证,否则我们的验证将变得非常复杂,因为组合将增加。

代码语言:javascript
运行
复制
const regex = /([|@\\]+)?([\w]+)/gm;
const str = `meaning
meaning|description
meaning@id
meaning|description@id
|description
|description@id
@id
meaning@id|description
sub1\\|sub2
mea\\|ning|descri\\@ption
mea\\@ning@id
meaning|description@identific\\|\\@ation`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

演示

票数 0
EN

Stack Overflow用户

发布于 2019-06-14 18:41:45

看来你要找的可能是这个?

代码语言:javascript
运行
复制
((?:\\@|\\\||[^\|@])*)*

说明:匹配包括"\@""\|"或除"@""|"以外的任何字符的所有集合。

https://regexr.com/4fr68

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

https://stackoverflow.com/questions/56603404

复制
相关文章

相似问题

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