Страницы: 1
RSS
Поиск кириллицы (регулярные выражения), Не выходит найти кириллицу в тексте между кавычками
 
Добрый день.
У меня есть кучка текста, откуда я хочу выдернуть наименования, заключенные в кавычках. Достаточно первого вхождения искомых данных.
Вот пример:
Цитата
"Return this"
Текст "Return this"
"Return this" Текст
Текст "Return this" Текст
"Return "this" Текст
Текст "Return "this"
Текст "Return "this" Текст

"Верни это"
Текст "Верни это"
"Верни это" Текст
Текст "Верни это" Текст
"Верни "это" Текст
Текст "Верни "это"
Текст "Верни "это" Текст
Выражение:
Код
\b\S\[А-я]*.\S\[А-я]*\S\b|\b\S\[А-я]*\S\b|\b\S\w*.\S\w*\S\b|\b\S\w*\S\b
Тексты на латинице выражение находит без проблем, а вот кириллицу упорно игнорирует и я не могу понять, по какой причине.
Помогите, пжлста :)

Использую пользовательскую функцию из этого поста: https://www.planetaexcel.ru/techniques/7/4844/
 
Здравствуйте. Мне кажется, вот такого паттерна будет достаточно:
Код
[""]+[А-Яа-яЁё ]+[""]+

кавычки любыеСимволыКириллицыИпробел кавычки
Кому решение нужно - тот пример и рисует.
 
Пытливый, При таком варианте некорректно возвращает данные типа "КавычкиТекст КавычкиТекстКавычки"
 
Awallon, зачем ограничивать помощь себе только RegExp'ом?… Регулярки и не только
Изменено: Jack Famous - 08.05.2019 11:39:44
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Доброе время суток.
Awallon, вы бы всё же почётче описали - что вы хотите: первый набор символов, заключённый в двойные кавычки. Набор символов кириллицы между двойными кавычками или что? Нет чёткого определения - задача не решаема в принципе :)
Цитата
Awallon написал:
Тексты на латинице выражение находит без проблем, а вот кириллицу упорно игнорирует
Потому что используете \b - псевдосимвол границы слова, а эта граница определяется только для латинского набора символов.
 
Андрей VG, Попробую.
Есть строка. В строке бывает несколько вариантов текста, где одна из подстрок содержит текст, заключенный в кавычки. Мне нужно вытащить текст между первой и последней кавычкой.
В кавычках заключен текст, написанный кириллицей и латиницей.
Цитата
"Return this" Результат "Return this"
Текст "Return this" Результат "Return this"
"Return this" Текст Результат "Return this"
Текст "Return this" Текст Результат "Return this"
"Return "this" Текст Результат "Return "this"
Текст "Return "this" Результат "Return "this"
Текст "Return "this" Текст Результат "Return "this"


"Верни это" Результат "Верни это"
Текст "Верни это" Результат "Верни это"
"Верни это" Текст Результат "Верни это"
Текст "Верни это" Текст Результат "Верни это"
"Верни "это" Текст Результат "Верни "это"
Текст "Верни "это" Результат "Верни "это"
Текст "Верни "это" Текст Результат "Верни "это"
Кавычки используют разные. В основном обычные ". Встречаются также «» и “”. Совсем редко апостроф
Изменено: Awallon - 08.05.2019 12:01:41
 
Попробовал "в лоб"
Код
["«“][А-я ]*["«“][А-я ]*["»”]|["«“][А-я ]*["»”]|\b\S\w*.\S\w*\S\b|\b\S\w*\S\b
И это сработало, но не до конца. Например, в таком тексте:
Цитата
Общества с ограниченной ответственностью «СПМК-2»
Выдало ошибку #ЗНАЧ
Изменено: Awallon - 08.05.2019 13:06:50
 
Цитата
Awallon написал:
между первой и последней кавычкой.
Где расположены эти первая и последняя? В регулярках нужно полностью проговаривать все что, где, как, когда и прочие определения. Краткость тут только погубит.
Цитата
Awallon написал:
Встречаются также «» и “”. Совсем редко апостроф
Нет примера, нет учёта такой штуки. Если вашем примере ищется выделенное слово Результат (другого определения в вашем описании того, что нужно найти я не нашёл - тупой однако), то такой вариант
Код
Public Function getTextBetweenQuotes(ByVal fromText As String) As String
    Dim pReg As Object, p
    Set pReg = CreateObject("VBScript.RegExp")
    pReg.IgnoreCase = True
    pReg.Pattern = """[^""]+"".+?([а-я]+)(?= ""[^""]+"")"
    getTextBetweenQuotes = pReg.Execute(fromText)(0).SubMatches(0)
End Function
 
Цитата
Андрей VG написал:
Где расположены эти первая и последняя?
В ячейке табличного редактора MS Excel, начиная с первого символа слева и заканчивая последним символом справа. Между первым и последним символом находится разнообразный текст. Часть этого текста заключен в кавычки. Всё, что внутри кавычек, нужно мне.
Цитата
Андрей VG написал:
Если вашем примере ищется выделенное слово Результат
Нет, в моем примере не ищется слово "Результат". В моем примере ищется текст, заключенный в кавычки.
В примере слева - примеры оригинального текста.
В примере слово "Результат" обозначает, что дальше справа будет результат работы функции.
В примере справа от слова "Результат" написан желаемый результат работы функции.
Цитата
Андрей VG написал:
Нет примера, нет учёта такой штуки
Расширил варианты отображения примера. Сделать варианты, где кавычки могут пересекаться друг с другом?
Например, "Return «this”. Или и так ясно, что человеческая фантазия безгранична и вручную напечатанный текст изобилует подобными перлами?
Цитата
"Return this" ==>> Результат ==>> "Return this"
Текст "Return this" ==>> Результат ==>> "Return this"
"Return this" Текст ==>> Результат ==>> "Return this"
Текст "Return this" ==>> Результат ==>> "Return this"
"Return "this" Текст ==>> Результат ==>> "Return "this"
Текст "Return "this" ==>> Результат ==>> "Return "this"
Текст "Return "this" ==>> Результат ==>> "Return "this"


"Верни это" ==>> Результат ==>> "Верни это"
Текст "Верни это" ==>> Результат ==>> "Верни это"
"Верни это" Текст ==>> Результат ==>> "Верни это"
Текст "Верни это" ==>> Результат ==>> "Верни это"
"Верни "это" Текст ==>> Результат ==>> "Верни "это"
Текст "Верни "это" ==>> Результат ==>> "Верни "это"
Текст "Верни "это" Текст ==>> Результат ==>> "Верни "это"


«Return this» ==>> Результат ==>> «Return this»
Текст «Return this» ==>> Результат ==>> «Return this»
«Return this» Текст ==>> Результат ==>> «Return this»
Текст «Return this» ==>> Результат ==>> «Return this»
«Return «this» Текст ==>> Результат ==>> «Return «this»
Текст «Return "this» ==>> Результат ==>> «Return «this»
Текст «Return "this» ==>> Результат ==>> «Return «this»


«Верни это» ==>> Результат ==>> «Верни это»
Текст «Верни это» ==>> Результат ==>> «Верни это»
«Верни это» Текст ==>> Результат ==>> «Верни это»
Текст «Верни это» ==>> Результат ==>> «Верни это»
«Верни «это» Текст ==>> Результат ==>> «Верни «это»
Текст «Верни «это» ==>> Результат ==>> «Верни «это»
Текст «Верни «это» Текст ==>> Результат ==>> «Верни «это»


“Return this” ==>> Результат ==>> “Return this”
Текст “Return this” ==>> Результат ==>> “Return this”
“Return this” Текст ==>> Результат ==>> “Return this”
Текст “Return this” ==>> Результат ==>> “Return this”
“Return “this” Текст ==>> Результат ==>> “Return “this”
Текст “Return “this” ==>> Результат ==>> “Return “this”
Текст “Return “this” ==>> Результат ==>> “Return “this”


“Верни это” ==>> Результат ==>> “Верни это”
Текст “Верни это” ==>> Результат ==>> “Верни это”
“Верни это” Текст ==>> Результат ==>> “Верни это”
Текст “Верни это” ==>> Результат ==>> “Верни это”
“Верни “это” Текст ==>> Результат ==>> “Верни “это”
Текст “Верни “это” ==>> Результат ==>> “Верни “это”
Текст “Верни “это” Текст ==>> Результат ==>> “Верни “это”
 
И не лень же вам тут тест набирать. Только вот подумать, а как тестировать ваши варианты что на входе и что получается на выходу.... Мыслей не возникало? Забота о помогающих на высоте  :D
Вариант для довотки напильником.
Код
Public Function getTextBetweenQuotes(ByVal fromText As String) As String
    Dim pReg As Object, pCheck As Object, firstStep As String
    Set pReg = CreateObject("VBScript.RegExp")
    pReg.IgnoreCase = True
    Set pCheck = CreateObject("VBScript.RegExp")
    pCheck.Global = True
    pCheck.Pattern = "[""“”'«""»]"
    pReg.Pattern = "[""“'«""](.+[”""'»])(?=\w| |$)"
    firstStep = pReg.Execute(fromText)(0).SubMatches(0)
    If pCheck.Execute(firstStep).Count Mod 2 = 1 Then
        firstStep = Left$(firstStep, Len(firstStep) - 1)
    End If
    getTextBetweenQuotes = Trim$(firstStep)
End Function
 
(['"])(.+?)\1

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

найдет первую кавычку из набора потом между ними некий набор и точно такую же кавычку для закрытия (обратная ссылка на группу. И так для каждого "вида" кавычек.
Для того чтобы не морочиться с кавычками вида  «» предлагаю простой способ - заменить их на какой то набор символов  например #@#
и считать эту группу "кавычкой либо открывающейся либо закрывающейся. тогда и по нему можно будет сделать обратную ссылку на группу  и все будет работать

(['"(#@#)])(.+?)\1
Изменено: Владимир - 07.07.2022 06:55:53
Страницы: 1
Наверх