我在网上找到了许多正则表达式匹配第一次出现的字符串,某个字符,一个单词等的解决方案,但我还没有找到匹配第一次出现的一组字符的解决方案(或者在我的情况下) ,不匹配一组字符)。
e.g。我有一个字符串如下(在javascript中):
var testString = '~!@#$%^&*()_+|}{POIUYTREWQ":?><asdfghjklm,./;[]\=-0987654321`~!@#$%^&*()_+|}{POIUYTREWQ":?><asdfghjklm,./;[]\=-0987654321`~!@#$%^&*()_+|}{POIUYTREWQ":?><asdfghjklm,./;[]\=-0987654321`'
正如您所看到的,testString中有很多很多很多奇怪的字符。
我提出了一个正则表达式匹配,以显示哪些是令人讨厌的字符,如下所示:
var regTest = /[^A-Za-z0-9.,?()@\[\]\-\/ ]/g;
var wrongChar = testString.match(regTest);
现在,我的问题是,尽管wrongChar很好地返回了一个不匹配的字符数组,但它给了我每次出现的字符,如下所示:
~,!,#,$,%,^,&,*,_,+,|,},{,",:,>,<,;,\,=,`,~,!,#,$,%,^,&,*,_,+,|,},{,",:,>,<,;,\,=,`,~,!,#,$,%,^,&,*,_,+,|,},{,",:,>,<,;,\,=,`
有没有办法只给我一个快速方式的第一次出现的每个不需要的字符(例如我的正则表达式的更改),或者我是否必须创建2个数组来继续测试是否已经保存了一个字符wrongChar(长方法)?
答案 0 :(得分:0)
使用search
方法:
var testString = '~!@#$%^&*()_+|}{POIUYTREWQ":?><asdfghjklm,./;[]\=-0987654321`~!@#$%^&*()_+|}{POIUYTREWQ":?><asdfghjklm,./;[]\=-0987654321`~!@#$%^&*()_+|}{POIUYTREWQ":?><asdfghjklm,./;[]\=-0987654321`';
var regTest = /[^A-Za-z0-9.,?()@\[\]\-\/ ]/g;
var first = testString.search(regTest);
请注意,如果该方法与您提供的正则表达式不匹配,则返回-1(此方法类似于indexOf
)
答案 1 :(得分:0)
要仅获得一次出现,请使正则表达式非全局。
要仅获取每个字符一次,只需从wrongChar
结果数组中删除重复项:
var singleChars = wrongChar.sort().reduce(function(res, x) {
if (x != res[res.length-1])
res.push(x);
return res;
}, []);