代码之家  ›  专栏  ›  技术社区  ›  sudoExclamationExclamation

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

  •  0
  • sudoExclamationExclamation  · 技术社区  · 5 年前

    假设我在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 回复  |  直到 5 年前
        1
  •  2
  •   Nick SamSmith1986    5 年前

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

    • 线的起点,或一些空格 (^| +) 在第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);
        2
  •  0
  •   Lukas Bach    5 年前

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

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

        3
  •  0
  •   Harvard Pan    5 年前

    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);