Как применить регулярное выражение до и после определенного символа

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

Чтобы быть более конкретным, я кодирую веб-сайт (в React.JS), показывающий логические вычисления, и я хочу удалить первую и последнюю круглые скобки перед и после основного логического оператора. Например, в строке:

"((p∧r)∧(q∧r))∧(p∧q)"

Хочу приобрести только: "(p∧r)∧(q∧r)" и "p∧q".

Это означает, что я хочу получить весь символ до и после единственного "∧" вне скобок, и я хочу удалить первую открывающую скобку и последнюю закрывающую скобку из двух строк. (Результатом может быть, например, массив с частью до и после.) Я уже могу удалить первую скобку с помощью этого кода:

str.replace(/(\()(.*)(\))/, "$2");

Но прямо сейчас этот код применяется ко всей строке.

Итак, как мне применить этот код к двум частям до и после единственного "∧" вне скобок? Если возможно, я бы предпочел код только в регулярном выражении, но часть JavaScript подойдет. Заранее спасибо.

Предоставьте четкий пример ввода и желаемый результат.

Pedro Lobito 27.08.2018 20:40

Возможно ли иметь более двух условий? например: (a^a) ^ (b^b) ^ (c^c)?

Julio 27.08.2018 20:57

Мой веб-сайт должен показывать бесконечное количество возможных комбинаций символов, которые подчиняются определенному шаблону. У него никогда не будет более одного оператора вне скобок, и у него будет только что-то до и после этого оператора. Вот другие примеры: p∧ (p∧q) должен возвращать ["p", "p∧q"]. (p⊃ (p∧q)) ∧ (p∧ ((p∧p) ∧q)) должен возвращать ["p⊃ (p∧q)", "p∧ ((p∧p) ∧q)"] .

muleet 27.08.2018 21:10

Julio> Не может быть двух операторов рядом друг с другом, а буква или скобка не могут быть рядом с двумя операторами. Мой код уже справляется со всем этим.

muleet 27.08.2018 21:13

Я имею в виду, что во всех ваших примерах вы всегда возвращаете 2 "куски". Можно ли вернуть любое другое число, кроме 2? Например, (a^x)^(b^y)^(c^z) вернет ['(a^x)','(b^y)','(c^z)']? Это правильно или вы всегда работаете с выражениями Только 2 в сочетании с каким-то логическим оператором?

Julio 27.08.2018 21:20

Да, в конце всегда только 2 выражения. (Между прочим, это все аристотелевские вещи, я не придумал лично правила, которые описываю.) Что-то вроде ваших примеров или просто p∧p∧p, p∧q∧r или p⊃q∧r просто было бы странно интерпретировать логически. Таким образом, они никогда не являются частью моего веб-сайта и не должны учитываться здесь.

muleet 27.08.2018 21:24

@mulet, если вас это все еще интересует, вы можете задать аналогичный вопрос, но не запрашивать регулярное выражение. Я закодировал решение с простым javascript и рекурсией, которое должно работать. Но я не могу разместить его здесь, потому что вопрос уже закрыт.

Julio 28.08.2018 13:16

Привет, спасибо, Хулио! Я только что увидел твое сообщение. Я думаю, что мне удалось создать хороший код javascript для этого самостоятельно (не совсем уверен, работает ли он для всех возможностей, и, вероятно, это слишком долго и слишком уродливо), поэтому я был бы счастлив увидеть ваше решение. Не могли бы вы выложить это на pastebin и разместить ссылку здесь? Заранее спасибо.

muleet 28.08.2018 16:08

@muleet, загружено здесь: jsfiddle.net/74exhz0b/5. Посмотрите, работает ли это для вас

Julio 28.08.2018 16:54

Я думаю, что мой код подойдет для моего сайта, но все равно большое спасибо!

muleet 28.08.2018 18:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
10
101
2

Ответы 2

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

Так что вам понадобится javascript. Сделать это в javascript будет непросто, так как вам нужно будет проанализировать всю строку, чтобы найти «^ -who-are-not-in-скобки».

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

Если вы чего-то не найдете, вам нужно будет создать себя.

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

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

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

Вы можете сделать это так:

// your string
const fixMe = "((p∧r)∧(q∧r))^(p∧q)";

// Separate double paren items from single paren items
const parts = fixMe.match(/\(\(.*\)\)|\(.*\)/g).map(
  // Get rid of leading and following parens
  item => item.replace(/^\(|\)$/g, '')
);

Однако обратите внимание: это решение не очень гибкое. Лучше может быть какой-то рекурсивный поиск в круглых скобках, где каждый цикл ведет учет уровня вложенности и т. д.

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

Félix Brunet 27.08.2018 20:51

Спасибо за ваш код, но этого недостаточно для моих нужд. Бывают случаи, когда к основному логическому оператору примыкает только один символ (например, «p»), а иногда это может быть как бы десятиуровневой скобкой (хотя это было бы очень необычно). - muleet 12 минут назад

muleet 27.08.2018 21:52

Другие вопросы по теме