Regex: Как (лучше) оптимизировать текст из / для сообщений - PullRequest
0 голосов
/ 06 января 2019

Так как этот вопрос не содержит конкретного вопроса о регулярном выражении, но больше о его дизайне / подходе, может потребоваться некоторое время, чтобы понять требования и их зависимости. Я сделал все от меня зависящее, чтобы сделать это как можно проще с этим полностью работающим, но не элегантным решением .


Мне нужно оптимизировать текст в платформе обмена сообщениями, которая создается / редактируется другими и, возможно, должна быть очищена с помощью регулярных выражений. Все оптимизации должны быть выполнены с одним регулярным выражением, так как это происходит часто и довольно дорого (или я ошибаюсь?). Кроме того, регулярное выражение должно быть независимым от языка (по крайней мере, совместимым с Javascript и Php). И последнее, но не менее важное: оптимизированный текст не должен содержать (дополнительный) HTML, поскольку он используется в текстовой среде.

Требования

Оптимизировать линии

  • Удалить отдельные строки
  • Не удалять одиночные строки, заканчивающиеся двумя | без пробелов (таким образом, редакторы могут принудительно вводить новую строку)
  • Не удалять пустые строки (двойные разрывы)
  • Не удалять одиночные строки, начинающиеся с символа | char | digit | entity + space (необработанные списки)
  • Сжать несколько последовательных пустых строк (двойные разрывы строк) до одного двойного переноса строк

Оптимизировать пробелы

  • Удалить лишние пробелы
  • Не удалять пробелы в конце предложения

Оптимизация комментариев

  • Удалить однострочные комментарии
  • Не удалять завершающие комментарии

В целом

  • Сохранить Html и не добавлять Html

Промежуточное решение

Пока что мое решение состоит в том, чтобы объединить 4 регулярных выражения, которые «соответствуют» моим требованиям, и заменить одним пробелом :

  • Соответствует отдельным строкам, оставляя пустые строки нетронутыми и сохраняя необработанные списки: \n(?!\n|[-_.○•♥→›>+%\/*~=] |[a-zA-Z_1-9+][\.|\)|\:|\*]) (длина зависит от нескольких типов стилей списков, которые я хочу поддерживать)
  • Соответствует лишним пустым строкам: (\n+)(?=\n\n)
  • Соответствует лишним пробелам: +
  • Соответствует однострочным комментариям (без учета конечных комментариев): ^\n?\/\/ .+\n

Чтобы сделать оптимизацию относительно недорогой, я объединяю их с | с одним регулярным выражением, которое я могу использовать в Javascript (а также в Php).

r = new RegExp(" \n(?!\n|[-_.○•♥→›>+%\/*~=] |[a-zA-Z_1-9+][.):*] )|(\n+)(?=\n\n)| + |^\n?\/\/ .+\n", "gm");
i = document.getElementById("input").innerHTML;
p = " ";
o = i.replace(r, p);
document.getElementById("output").innerHTML = o;
#input, #output { width: 100%; height: 88vh; }
#input { display: none; } #output { border: none; }
<textarea id="input">

MAKE PARAGRAPHS

This is the first paragraph. 
Some sentences end with newlines. 
Some don't. We need to cope with that.

This is the second paragraph. 
It contains some  unnecessary   spaces. 
Even at the end of a line.    

This is the third paragraph. 
Some sentences end with question- and exclamation-marks. 
I hope that is ok for you. Is it? That's great! Really. 


KEEP LISTS

This is an unordered list, starting with a minus+space: 

- This is the first item. 
- This is the second item. 
- This is the third item. 

Here is an unordered list, starting with entity|symbol+space: 

• This is the second item.
> This is the third item. // Works in php only 
* This is the fifth item. 

This is a (manually) ordered lists, starting with char|digit+entity+space: 

1. This is the first item. 
b) This is the second item. 
3: This is the third item. 

Here is a mathematical list, starting with operators: 

+ Plus 
- Minus 
% Percentage 
/ Division 
* Multiply 
~ Like 
= Equal 

These are (manually) ordered lists, which are not summed up because they do not end with a space: 

1 This is the first item.
b This is the second item.
I like the third item.

First: This works.
Second: It works great.
Third: That is nice!


KEEP HTML

The input text may contain <a href="https://example.com" target="_blank">Html</a>. 
The output text must simply keep it for further processing. 
The output must not add Html as it is processed in a text-only environment. 
I know this sounds stupid, but it isn't. 


REMOVE COMMENTS

Single/whole line comments are being removed.

// Sources 
// Removing single lines: https://regex101.com/r/qU1eP8/5 
// Removing comments: https://www.perlmonks.org/?node_id=996552 

// Tests 
// Dialog: https://api.sefzig.net/dialog/test/regex/ 
// Jsbin: https://jsbin.com/goromad/edit?output 
// Regex101: https://regex101.com/r/Xz5atA/2 
// Regexr: https://regexr.com/45svm 

Thank you, regex ♥ // Problem solved



~Fin~
</textarea>
<textarea id="output"><!-- Press "Run" --></textarea>

Мой запрос

Поскольку я не эксперт по регулярным выражениям, и мой подход кажется обременительным, я хотел бы услышать ваши предложения. Я знаю, что Regex стоит дорого, и все можно сделать лучше.

Вы могли бы задаться вопросом о некоторых деталях, которые я не упомянул здесь для ясности. Вы также можете проверить мои регулярные выражения. Вот почему я создал песочницу, выделив требования (регулярные выражения), содержащий пример текста со всеми вариантами использования, а также подробное описание:

Если вы хотите использовать функции отличных инструментов, вот вам:

Спасибо

за помощь в исправлении этой важной функции моей платформы сообщений ! Пожалуйста, не стесняйтесь улучшать мой подход, предлагать альтернативу или использовать результаты в своем собственном проекте ♥

Это мой первый вопрос о переполнении стека. Я много исследовал. Пожалуйста, потерпите меня, если я сделал что-то не так, и помогите мне исправить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...