正则表达式删除所有前导和尾随特殊字符?

Regex remove all leading and trailing special characters?

假设我在 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

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

这样的事情可能会有所帮助:

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] 然后我们在子字符串上执行正则表达式,并且 return 第一个捕获组导致我们的转换函数。请注意,如果子字符串不包含正确的字符,则这可能为 null。最后我们用空格连接子串。

这个正则表达式应该做你想做的。它寻找

  • 行首,或在组 1
  • 中捕获的 spaces (^| +)
  • 一些符号字符[!-\/:-@\[-``\{-~]*
  • 第 2 组
  • 中捕获的最少数量的非 space 字符 ([^ ]*?)
  • 一些符号字符[!-\/:-@\[-``\{-~]*
  • 后跟 space 或行尾(使用正向前看)(?=\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, '');
console.log(str);

请注意,如果您想单独保留一串标点字符(例如 Apple & Sauce),您应该更改第二个捕获组以坚持存在一个或多个非 space 个字符 (([^ ]+?)) 而不是 none 并在标点符号字符的初始匹配后添加前瞻以断言下一个字符不是标点符号:

let str = 'Apple &&& Sauce; -This + !That!';
str = str.replace(/(^| +)[!-\/:-@\[-`\{-~]*(?![!-\/:-@\[-`\{-~])([^ ]+?)[!-\/:-@\[-`\{-~]*(?=\s|$)/gi, '');
console.log(str);

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

以下是用于捕获每个单词的单个正则表达式。逻辑是它将查找第一个有效字符作为捕获组的开头,然后查找 space 字符或字符串终止符之前的最后一个无效字符序列作为捕获组的结尾。

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, '');
console.log(myString);