我希望实现一个函数,该函数从一个输入字符串输出相应的字符串,如“str1\str2@str3”:
function myFunc(string) { ... }
然而,对于输入string
,只需要有str1
。str2
和str3
(带分隔符)都是可选的。为此,我已经编写了一个执行一种拆分的正则表达式。我不能(正常)拆分,因为分隔符是不同的字符,而且str1、str2和str3的顺序也很重要。这和我的regex模式差不多。现在,我很难扩展这个模式,以便您可以通过使用\或@来转义这两个分隔符。
我怎么才能最好地解决这个问题呢?
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]
发布于 2019-06-14 18:32:33
您需要允许\\[|@]
在模式中使用\w
替换\w
模式中的(?:\\[@|]|\w)
模式:
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或更多次重复\
,然后是@
或|
或一个单词字符
$
-字符串的末端。发布于 2019-06-14 18:31:01
我的猜测是,您希望拆分所有字符串,为此,我们可能会在char类中添加这些分隔符,类似于:
([|@\\]+)?([\w]+)
如果我们不这样做,我们可能想这样做的验证,否则我们的验证将变得非常复杂,因为组合将增加。
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}`);
});
}
发布于 2019-06-14 18:41:45
https://stackoverflow.com/questions/56603404
复制相似问题