Как отфильтровать символы, которые не являются буквами, цифрами или пунктуацией - PullRequest
0 голосов
/ 27 января 2019

У меня есть строка, которая будет иметь много форматирующих элементов, таких как маркеры, стрелки или что-то еще.Я хочу очистить эту строку, чтобы она содержала только буквы, цифры и знаки препинания.Несколько пробелов должны быть заменены одним пробелом тоже.

Допустимая пунктуация: , . : ; [ ] ( ) / \ ! @ # $ % ^ & * + - _ { } < > = ? ~ | "

В основном все, что разрешено в этой 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 просто удаляет символы, которые он не распознает, поэтому он выглядит как обычная строка. Вот паста .

EDIT2: Я думаю, что это то, что мне нужно:

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

Я проверяю это в разных случаях, чтобы убедиться.

Ответы [ 3 ]

0 голосов
/ 27 января 2019
  • Вероятно, нет лучшего решения, чем регулярное выражение.Внутренняя реализация действий регулярных выражений обычно хорошо оптимизируется благодаря возрасту и повсеместности.
  • Вы можете быть в состоянии явно указать обработчику регулярного выражения "скомпилировать" регулярное выражение.Обычно это хорошая идея, если вы знаете, что регулярное выражение будет часто использоваться в программе, и может помочь с производительностью здесь.Но я не знаю, предоставляет ли javascript такую ​​возможность.
  • Идея "обычной пунктуации" не имеет отличного основания.Есть некоторые общие метки, такие как «90 °», которые не являются ASCII, и некоторые метки ASCII, такие как «» (&#127;), которые вы почти наверняка не хотите .Я ожидаю, что вы найдете подобные крайние случаи с любым заранее составленным списком.В любом случае, просто явно перечислить все знаки препинания, которые вы хотите разрешить, лучше в целом , потому что тогда никому не придется искать то, что в списке, который вы выбрали.
  • Вы может быть в состоянии выполнить обе замены за один проход, но неясно, будет ли это работать лучше, и это почти наверняка не будет яснее для любых коллег (включая вас самих из будущего).Будет много примитивных деталей, например: " ° " следует заменить на "", " " или " ".
0 голосов
/ 27 января 2019

Вот как я буду делать.Сначала я удалю все недопустимые символы, а затем заменю несколько пробелов одним пробелом.

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" во втором регулярном выражении.

0 голосов
/ 27 января 2019

Вы можете добиться этого, используя приведенное ниже регулярное выражение, которое находит все не-ascii символы (также исключает непечатаемые символы ascii и исключает также расширенные ascii) и удаляет его с пустой строкой.

[^ -~]+

Этопри условии, что вы хотите сохранить только все печатаемые символы ASCII, которые варьируются от пробела (значение 32 для ascii) до тильды ~, следовательно, использование этого набора символов [^ !-~]

и затем заменяет все одно или несколько пробелов наодин пробел

 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, ' '));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...