正则表达式删除所有开头和结尾的特殊字符吗?

时间:2019-10-20 01:04:51

标签: javascript regex regex-greedy

假设我在javascript中有以下字符串:

&a.b.c. &a.b.c& .&a.b.c.&. *;a.b.c&*. a.b&.c& .&a.b.&&dc.& &ê.b..c&

我想从所有单词中删除所有前导和尾随特殊字符(任何不是字母数字或其他语言的字母)。

因此字符串应类似于

a.b.c a.b.c a.b.c a.b.c a.b&.c a.b.&&dc ê.b..c

请注意如何保留字母数字之间的特殊字符。最后一个ê也被留下。

3 个答案:

答案 0 :(得分:2)

此正则表达式应该执行您想要的操作。它寻找

  • 行首,或第1组中捕获的某些空格(^| +)
  • 一些符号字符[!-\/:-@\[-``\{-~]*
  • 第2组中捕获的最少数量的非空格字符([^ ]*?)
  • 一些符号字符[!-\/:-@\[-``\{-~]*
  • 后跟空格或行尾(使用正向超前)(?=\s|$)

仅将第1组和第2组(符号之间的间距和字符)替换为匹配项。

let str = '&a.b.c. &a.b.c& .&a.b.c.&. *;a.b.c&*. a.b&.c& .&a.b.&&dc.& &ê.b..c&';
str = str.replace(/(^| +)[!-\/:-@\[-`\{-~]*([^ ]*?)[!-\/:-@\[-`\{-~]*(?=\s|$)/gi, '$1$2');
console.log(str);

答案 1 :(得分:1)

类似的事情可能会有所帮助:

const string = '&a.b.c. &a.b.c& .&a.b.c.&. *;a.b.c&*. a.b&.c& .&a.b.&&dc.& &ê.b..c&';
const result = string.split(' ').map(s => /^[^a-zA-Z0-9ê]*([\w\W]*?)[^a-zA-Z0-9ê]*$/g.exec(s)[1]).join(' ');
console.log(result);

请注意,这不是一个正则表达式,而是使用JS帮助代码。

粗略的解释:我们首先将字符串分成字符串数组,并用空格分隔。然后,我们通过剥离来转换每个子字符串 前导和尾随特殊字符。我们使用[^a-zA-Z0-9ê]*捕获所有特殊字符,因为前导^字符与列出的所有字符 匹配,因此匹配所有特殊字符。在这两组之间,我们用([\w\W]*?)捕获所有相关字符。 \w捕获单词,\W捕获非单词,因此\w\W捕获所有可能的字符。通过在?后面附加*,我们使量词*变得懒惰,以使该组在捕获尾随特殊字符的下一个组捕获某些内容时就停止捕获。我们还以^符号开头正则表达式,并以$符号结尾正则表达式以捕获整个字符串(它们分别在字符串的末尾设置了定位点)。然后使用.exec(s)[1]在子字符串上执行正则表达式,并在我们的转换函数中返回第一个捕获组结果。请注意,如果子字符串不包含正确的字符,则该字段可能为null。最后,我们用空格将子字符串连接起来。

答案 2 :(得分:1)

a-zA-Z\u00C0-\u017F用于捕获所有有效字符,包括变音符号。

以下是捕获每个单词的单个正则表达式。逻辑是它将寻找第一个有效字符作为捕获组的开始,然后寻找无效字符的最后一个序列,将空格字符或字符串终止符作为捕获组的末尾。

const myRegEx = /[^a-zA-Z\u00C0-\u017F]*([a-zA-Z\u00C0-\u017F].*?[a-zA-Z\u00C0-\u017F]*)[^a-zA-Z\u00C0-\u017F]*?(\s|$)/g;  
let myString = '&a.b.c. &a.b.c& .&a.b.c.&. *;a.b.c&*. a.b&.c& .&a.b.&&dc.& &ê.b..c&'.replace(myRegEx, '$1$2');
console.log(myString);