如何过滤掉不是字母,数字或标点符号的字符

时间:2019-01-27 15:23:34

标签: javascript node.js regex

我有一个字符串,其中包含很多格式化项目,例如项目符号,箭头或其他内容。我想清理此字符串,使其仅包含字母,数字和标点符号。多个空格也应替换为单个空格。

允许标点符号:, . : ; [ ] ( ) / \ ! @ # $ % ^ & * + - _ { } < > = ? ~ | "

this ASCII表中基本上允许的任何内容。

这是我到目前为止所拥有的:

let asciiOnly = y.replace(/[^a-zA-Z0-9\s]+/gm, '')
let withoutSpacing = asciiOnly.replace(/\s{2,}/gm, ' ')

Regex101:https://regex101.com/r/0DC1tz/2

我也尝试了[:punct:]标签,但很明显javascript不支持它。除了正则表达式外,还有什么更好的方法可以清除此字符串吗?图书馆或其他东西(我没找到)。如果没有,我将如何使用正则表达式执行此操作?我是否需要编辑第一个正则表达式以添加标点符号的每个字符?

编辑:我正在尝试在问题中粘贴示例字符串,但是SO只是删除了无法识别的字符,因此它看起来像一个普通的字符串。 Heres a paste

EDIT2:我认为这就是我所需要的:

let asciiOnly = x.replace(/[^\x20-\x7E]+/gm, '')
let withoutSpacing = asciiOnly.replace(/\s{2,}/gm, ' ')

我正在用不同的情况对其进行测试以确保。

3 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式来实现此目的,该正则表达式可以找到所有非ASCII字符(也排除了不可打印的ASCII字符,也排除了扩展的ASCII字符),并使用空字符串将其删除。

[^ -~]+

这是假设您只想保留所有可打印的ASCII字符,其范围从空格(ASCII值32)到波浪号~,因此使用此字符集[^ !-~]

然后用一个空格替换所有一个或多个空格

 var str = `Determine the values of P∞ and E∞ for each of the following signals:  b. 
 d. 
   f. 
Periodic and aperiodic signals Determine whether or not each of the following signals is periodic:
 b. 

Determine whether or not each of the following signals is periodic. If a signal is periodic, specify its fundamental period.
 b. 
 d. 

Transformation of Independent variables A continuous-time signal x(t) is shown in Figure 1. Sketch and label carefully each of the following signals:
   b.  c. 
d.     e.     f.  Figure 1: Problem Set 1.4
Even and Odd Signals
For each signal given below, determine all the values of the independent variable at which the even part of the signal is guaranteed to be zero.
 b. 
 d.  -------------------------`;

console.log(str.replace(/[^ -~]+/g,'').replace(/\s+/g, ' '));   

<!-- begin snippet: js hide: false console: true babel: false -->

console.log(str.replace(/[^ !-~]+/g,'').replace(/\s+/g, ' '));

此外,如果您只想允许所有字母数字字符和提到的特殊字符,则可以使用此正则表达式首先使用此正则表达式保留所有需要的字符,

[^ a-zA-Z0-9,.:;[\]()/\!@#$%^&*+_{}<>=?~|"-]+

用空字符串替换,然后用一个空格替换一个或多个空格。

var str = `Determine the values of P∞ and E∞ for each of the following signals:  b. 
     d. 
       f. 
    Periodic and aperiodic signals Determine whether or not each of the following signals is periodic:
     b. 
    
    Determine whether or not each of the following signals is periodic. If a signal is periodic, specify its fundamental period.
     b. 
     d. 
    
    Transformation of Independent variables A continuous-time signal x(t) is shown in Figure 1. Sketch and label carefully each of the following signals:
       b.  c. 
    d.     e.     f.  Figure 1: Problem Set 1.4
    Even and Odd Signals
    For each signal given below, determine all the values of the independent variable at which the even part of the signal is guaranteed to be zero.
     b. 
     d.  -------------------------`;

console.log(str.replace(/[^ a-zA-Z0-9,.:;[\]()/\!@#$%^&*+_{}<>=?~|"-]+/g,'').replace(/\s+/g, ' '));

答案 1 :(得分:1)

这就是我会做的。我将首先删除所有不允许的字符,然后用一个空格替换多个空格。

let str = `Determine the values of P∞ and E∞ for each of the following signals:  b. 
 d. 
	f. 
Periodic and aperiodic signals Determine whether or not each of the following signals is periodic:!!!23
 b. 

Determine whether or not each of the following signals is periodic. If a signal is periodic, specify its fundamental period.
 b. 
 d. 

Transformation of Independent variables A continuous-time signal x(t) is shown in Figure 1. Sketch and label carefully each of the following signals:
	b.  c. 
d.		e. 	f.  Figure 1: Problem Set 1.4
Even and Odd Signals
For each signal given below, determine all the values of the independent variable at which the even part of the signal is guaranteed to be zero.
 b. 
 d.  ------------------------- `

const op = str.replace(/[^\w,.:;\[\]()/\!@#$%^&*+{}<>=?~|" -]/g, '').replace(/\s+/g, " ")

console.log(op)

编辑:如果您想保留\n\t不变,请在第二个正则表达式中使用(\s)\1+, "$1"

答案 2 :(得分:0)

  • 可能没有比正则表达式更好的解决方案。由于年龄和普遍性,正则表达式动作的底层实现通常可以得到很好的优化。
  • 也许可以明确告诉正则表达式处理程序“编译”正则表达式。如果您知道正则表达式将在程序中大量使用,这通常是个好主意,并且可能在此处有助于提高性能。但是我不知道javascript是否提供了这样的选项。
  • “正常标点符号”的概念没有很好的基础。有一些常见的标记(例如“ 90°”)不是ASCII,还有一些ASCII标记,例如“”({&#127;),您几乎肯定不需要。我希望您能在任何预制清单中找到类似的边缘保护套。在任何情况下,只要明确列出您要允许的所有标点符号通常就比较好,因为这样一来,您将无需再查找所选列表中的所有内容。
  • 也许可以一次完成两个替换操作,但尚不清楚这样做是否会更好,而且几乎可以肯定,对于任何同事(包括您自己), -未来)。将有很多细节需要解决,例如应将" ° "替换为""" "还是" "