Страницы: 1
RSS
Регулярное выражение. Вытащить самое первое слово или выражение до первого пробела.
 
Доброго всем дня!

Помогите построить регулярное выражение для обработки следующего текста:
"Слово1 СловоN Главное_Слово Слово N+1"
Идея такая - мне необходимо вытащить самое первое слово или выражение до первого пробела. В этом случае это будет "Слово1".
Но если в предложении есть "Главное_Слово" - то нужно вытащить только его.

Мой паттерн выглядит так:
(Главное_слово)|([а-я]|[А-Я]|[-]\d+)+\ ?
В данном виде он вытаскивает всегда "Слово1", но если убрать в паттерне пробел перед вопросом, то он выделяет "Главное_Слово". Но если потом убрать "Главное_слово", то получается ошибка в выражении.

Как построить условие в регулярных выражениях, чтобы оно при наличии "Главное_Слово" выводило только его, если его нет, то первое слово до первого пробела,
 
Василий Тонкокшуров,  из Вашего названия темы можно понять задачу? Предложите новое - модераторы поменяют.
Прикрепите небольшой файл-пример и и приведите сообщение в порядок: уберите лишние пустые строки и вместо красного сделайте просто жирный шрифт.
 
Василий Тонкокшуров В RegExp есть метод Test проверяете сначала с одним паттерном на "Главное_Слово" если есть его выводите. если нет втыкаете другой паттерн.
Такие макросы здесь были  в темах
 
Цитата
необходимо вытащить самое первое слово или выражение до первого пробела
В вашем примере это будет "Слово, но не "Слово1
 
и если в слове будет ё, то этот паттерн проигнорирует такое слово
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Может такой надо
Код
(Слово1(?!.*Главное_Слово))|(Главное_Слово)
 
Отличное выражение! Наконец что-то рабочее :-) (проверяю на специальном сайте для проверки регулярок)

Теперь немного усложню ситуацию и расскажу, как я вышел из нее.
Есть конкретное выражение:
"Проверка КТиТ - 3мес х"
В данном предложении мне нужно вырезать только первое слово (может быть и не "проверка") до первого пробела. Данное слово может содержать цифры, тире, латинские символы.
Например: "проверка", "Проверка2", "Проверка-2", ... и т.д.
Но если в предложении есть слово "КТиТ", то вырезать только его.

До вашего последнего сообщения я из ситуации вышел так:
Код
([a-z]|[A-Z]|[а-я]|[А-Я]|[0-9]|[-]\d+)+\ ?

Оно исправно и всегда в VBA вырезает первое слово в предложении в любом его виде, как я написал выше.

Теперь, попробую переделать, согласно вашего кода:

Код
([a-z]|[A-Z]|[а-я]|[А-Я]|[0-9]|[-]\d+(?!.*КТиТ))|([a-z]|[A-Z]|[а-я]|[А-Я]|[0-9]|[-]\d+)+\ ?

Но теперь у меня выходит только первый символ "П"

Предложите свой вариант, пожалуйста.

 
Код
Function Find1Word$(s$, a)
  Dim re, c As Range
  For Each c In a
    If InStr(s, c) Then Find1Word = c: Exit Function
  Next
  Set re = CreateObject("VBScript.RegExp"): re.Pattern = "\S+"
  If re.test(s) Then Find1Word = re.Execute(s)(0)
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,  это слишком гениально! Это работает!
Сейчас попытаюсь адаптировать под свои нужды, потом скажу, что получилось.  
 
Видимо регулярка тогда для красоты. А можно и без нее
Код
Function Find2Word$(s$, a)
  Dim re, c As Range
  For Each c In a
    If InStr(s, c) Then Find2Word = c: Exit Function
  Next
 Find2Word = Left(s, InStr(1, s, " ", vbTextCompare) - 1)
End Functio
Код
(^\S+(?!.*КТиТ))|(КТиТ)

PS Василий Тонкокшуров Вы наверное изучаете регулярки?  Я тоже учусь. Только месяц назад начал изучать.

Изменено: Евгений Смирнов - 05.01.2022 11:44:51
 
Евгений Смирнов,

Возможно, в текущем примере да.

Но в моем случае нужно использовать несколько паттернов для поиска нужных слов и чисел в предложении. Т.е. строку я прогоняю в любом случае через регулярные выражения, а предложенная выше функция предлагает сделать выбор между двумя простыми паттернами. Иначе нужно делать один паттерн, но моих знаний в них не достаточно, чтобы сделать паттерн со сложным условием.

Ну и я не сталкивался ранее с регулярками. Просто появилась специфическая задача. Пришлось с ними повозиться, поскольку исходный текст для обработки не стандартизирован и простыми функциями вытащить из него что-то очень сложно.  
Изменено: Василий Тонкокшуров - 05.01.2022 11:51:28
 
Василий Тонкокшуров Понимаете чтобы кто-то мог вам помочь надо пример с 10-20 исходными строками  и что должно получиться в итоге тогда будет легче понять какой паттерн можно написать
 
Евгений Смирнов, да понимаю :-)
 
UDF
Код
Function iWord(cell$)
 With CreateObject("VBScript.RegExp")
     .Global = True
  If InStr(1, cell, "Главное_Слово") > 0 Then
    iWord = "Главное_Слово"
  Else
     .Pattern = "^\W+\d+"
   If .test(cell) Then
     iWord = .Execute(cell)(0)
   Else
     iWord = ""
   End If
  End If
 End With
End Function
Страницы: 1
Наверх