Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.05.2022, 08:19
Новичок на форуме
Отправить личное сообщение для Laks Посмотреть профиль Найти все сообщения от Laks
 
Регистрация: 09.05.2022
Сообщений: 5

Прошу помочь со сложным регулярным выражением
Здравствуйте!
Я не программист. Так, начинающий любитель. Поэтому можете сразу кинуть в меня тапок. Для начала.
Суть вопроса:
я давно подсел на один MUD. И захотел максимально его автоматизировать , используя js.
Однако столкнулся с ситуацией, когда просто не смог создать одно (ну два) регулярное выражение, которое бы матчило определенные места строк типа:
Bobby pierces an elite guard very hard.
Bobby pierces an elite guard extremely hard.
Bobby pierces an elite guard.
Bobby barely pierces an elite guard.
An elite guard pierces Bobby very hard.
An elite guard pierces Bobby extremely hard.
An elite guard pierces Bobby.
An elite guard barely pierces Bobby.

Из этих строк надо выбрать «Bobby» и «An elite guard». Причем в «An elite guard» могут быть символы «’» «,» «-» (например «En’gla, master of maces») и состоять оно может как из нескольких слов, так и из одного.

Сам я смог родить только подобное:
/^(\w+)\s(cleav|crush|slash|bludgeon|claw|drain|hit |pierc|shoot|sting|whip|bit|smit|stab)(e|es|s)\s([\w\s\'\-\,]+)(?:.|very|extrem)/
/^([\w\s\'\-\,]+)\s(?:barely)\s?(cleav|crush|slash|bludgeon|claw| drain|hit|pierc|shoot|sting|whip|bit|smit|stab)(e| es|s)\s(\w+)(?: very| extrem)/
но оно не работает корректно (сутками сидел, пытаясь переделывать так или иначе).
Может быть вы сможете мне помочь в написании регэкспа для моей задачи? Буду вам очень благодарен.
Ответить с цитированием
  #2 (permalink)  
Старый 09.05.2022, 08:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Laks,
подожду переводчика, а пока что на входе и что на выходе, напишите пожалуйста.
Ответить с цитированием
  #3 (permalink)  
Старый 09.05.2022, 08:49
Новичок на форуме
Отправить личное сообщение для Laks Посмотреть профиль Найти все сообщения от Laks
 
Регистрация: 09.05.2022
Сообщений: 5

Сообщение от рони Посмотреть сообщение
Laks,
подожду переводчика, а пока что на входе и что на выходе, напишите пожалуйста.
На входе строки типа:
Bobby pierces an elite guard very hard.
Bobby pierces an elite guard extremely hard.
Bobby pierces an elite guard.
Bobby barely pierces an elite guard.
An elite guard pierces Bobby very hard.
An elite guard pierces Bobby extremely hard.
An elite guard pierces Bobby.
An elite guard barely pierces Bobby.

На выходе надо получить:
Bobby
An elite guard

Или я не понял ваш вопрос?

Во входящих строках есть всегда "pierces " или "drains" или "bites" или любое другое из списка cleav|crush|slash|bludgeon|claw| drain|hit|pierc|shoot|sting|whip|bit|smit|stab.
Так же могут присутствовать "barely", "very hard", "extremely hard", "hard".
Причем если есть "barely" в строке, то нет "very hard", "extremely hard", "hard" и наоборот.
Я смог добиться получения из входящих строк "An elite guard" но не совсем корректно, вместо "An elite guard" в переменную пишется "An elite guard very hard" например. А с "barely" вообще засада - никак не получается...

Последний раз редактировалось Laks, 09.05.2022 в 08:56.
Ответить с цитированием
  #4 (permalink)  
Старый 09.05.2022, 09:48
Новичок на форуме
Отправить личное сообщение для Laks Посмотреть профиль Найти все сообщения от Laks
 
Регистрация: 09.05.2022
Сообщений: 5

Прочитав много постов тут у меня родилась мысль, которая реализовалась в такого монстра:
/^(\w[\w\s\'\-\,]+)\s(?:barely cleav|barely crush|barely slash|barely bludgeon|barely claw|barely drain|barely hit|barely pierc|barely shoot|barely sting|barely whip|barely bit|barely smit|barely stab|cleav|crush|slash|bludgeon|claw|drain|hit|pie rc|shoot|sting|whip|bit|smit|stab)(?:e|es|s)\s(\w[\w\s\'\-\,]+)./

Но добиться того, чтобы "very hard", "extremely hard", "hard" не матчились так и не получилось...

добавление к вышенаписанному регэкспу (?:.| extremely hard| very hard| hard) ломает работоспособность.

Последний раз редактировалось Laks, 09.05.2022 в 09:51.
Ответить с цитированием
  #5 (permalink)  
Старый 09.05.2022, 11:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Laks,
увы, не осилил, может кто-то другой, вам поможет выделить нужное из строк.
Ответить с цитированием
  #6 (permalink)  
Старый 09.05.2022, 11:45
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Laks, если не то - формулируйте задачу яснее и лаконичнее.

var text = ["Bobby pierces an elite guard very hard.",
"Bobby pierces an elite guard extremely hard.",
"Bobby pierces an elite guard.",
"Bobby barely pierces an elite guard.",
"An elite guard pierces Bobby very hard.",
"An elite guard pierces Bobby extremely hard.",
"An elite guard pierces Bobby.",
"An elite guard barely pierces Bobby."];

function getBobby(txt) {
  alert( txt.match(/bobby|an elite guard/ig) );
}

text.forEach(getBobby);
Ответить с цитированием
  #7 (permalink)  
Старый 09.05.2022, 13:15
Новичок на форуме
Отправить личное сообщение для Laks Посмотреть профиль Найти все сообщения от Laks
 
Регистрация: 09.05.2022
Сообщений: 5

Так Бобби и элитный гвард - это переменные значения входящего текста, которые могут быть любыми, исходя из условий выше.
Так что такой вариант - не вариант ))
Ответить с цитированием
  #8 (permalink)  
Старый 09.05.2022, 13:18
Новичок на форуме
Отправить личное сообщение для Laks Посмотреть профиль Найти все сообщения от Laks
 
Регистрация: 09.05.2022
Сообщений: 5

Сообщение от Laks
/^(\w[\w\s\'\-\,]+)\s(?:barely cleav|barely crush|barely slash|barely bludgeon|barely claw|barely drain|barely hit|barely pierc|barely shoot|barely sting|barely whip|barely bit|barely smit|barely stab|cleav|crush|slash|bludgeon|claw|drain|hit|pie rc|shoot|sting|whip|bit|smit|stab)(?:e|es|s)\s(\w[\w\s\'\-\,]+)./
придется в теле функции, которая это дело обрабатывает после получения переменных, заменять "hard", "very hard", "extremely hard" на пустое место...
типа такого:
var st1 = "";
st1 = name1.replace(/ hard/, "");
st1 = st1.replace(/ very/, "");
st1 = st1.replace(/ extremely/, "");
st1 = st1.replace(/ barely/, "");

Но костыли всегда ведут к ошибкам в коде (((

Может найдется профессор, кто сможет мой регэксп доработать?? Просто я уже все...
Ответить с цитированием
  #9 (permalink)  
Старый 09.05.2022, 13:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от Laks
, исходя из условий выше.
Ответить с цитированием
  #10 (permalink)  
Старый 10.05.2022, 00:41
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Laks,
последняя попытка понять ваш незамутнённый поток разума: кто-то кого-то протыкает и надо получить никнейм того, кто это делает, так? Т.е. получить часть текста до "pierces" или "barely pierces", да?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу помочь: скрипт для вывода текущего года. Denis345 Серверные языки и технологии 10 07.08.2018 14:49
Помогите решить проблему! Очень прошу помочь! sizdim Элементы интерфейса 2 06.04.2015 07:59
Прошу помочь найти ошибки в функциях Georka Элементы интерфейса 1 02.10.2014 10:08
Нужно обрезать путь до файла регулярным выражением javascript_pupil Общие вопросы Javascript 3 22.11.2010 11:46
Извлечь значение параметра из location.search регулярным выражением? Бобр Общие вопросы Javascript 8 26.01.2010 01:01