RegEx: захват значений между кавычками - PullRequest
181 голосов
/ 05 октября 2008

У меня есть такое значение:

"Foo Bar" "Another Value" something else

Какое регулярное выражение возвращает значения, заключенные в кавычки (например, Foo Bar и Another Value)?

Ответы [ 19 ]

4 голосов
/ 10 ноября 2016

БОЛЬШЕ ОТВЕТОВ! Вот решение, которое я использовал

\"([^\"]*?icon[^\"]*?)\"

TLDR;
замените слово icon на то, что вы ищете в указанных цитатах, и вуаля!


Способ, которым это работает, заключается в том, что он ищет ключевое слово и не заботится о том, что еще между кавычками. EG:
id="fb-icon"
id="icon-close"
id="large-icon-close"
регулярное выражение ищет кавычку "
затем он ищет любую возможную группу букв, которые не "
пока не найдет icon
и любая возможная группа букв, которая не "
затем он ищет закрытие "

3 голосов
/ 01 октября 2013

Мне понравилась более обширная версия Axeman, но у меня возникли некоторые проблемы (например, она не соответствовала

).
foo "string \\ string" bar

или

foo "string1"   bar   "string2"

правильно, поэтому я попытался это исправить:

# opening quote
(["'])
   (
     # repeat (non-greedy, so we don't span multiple strings)
     (?:
       # anything, except not the opening quote, and not 
       # a backslash, which are handled separately.
       (?!\1)[^\\]
       |
       # consume any double backslash (unnecessary?)
       (?:\\\\)*       
       |
       # Allow backslash to escape characters
       \\.
     )*?
   )
# same character as opening quote
\1
2 голосов
/ 12 февраля 2014
string = "\" foo bar\" \"loloo\""
print re.findall(r'"(.*?)"',string)

просто попробуйте, работает как шарм !!!

\ обозначает пропуск символа

1 голос
/ 06 мая 2018

В отличие от ответа Адама, у меня есть простой, но сработавший:

(["'])(?:\\\1|.)*?\1

И просто добавьте круглые скобки, если вы хотите получать контент в кавычках, подобных этому:

(["'])((?:\\\1|.)*?)\1

Тогда $1 соответствует кавычке, а $2 соответствует строке содержимого.

1 голос
/ 04 мая 2018

Дополнительный ответ для подмножества Только для кодировщиков Microsoft VBA , каждый использует библиотеку Microsoft VBScript Regular Expressions 5.5, и это дает следующий код

Sub TestRegularExpression()

    Dim oRE As VBScript_RegExp_55.RegExp    '* Tools->References: Microsoft VBScript Regular Expressions 5.5
    Set oRE = New VBScript_RegExp_55.RegExp

    oRE.Pattern = """([^""]*)"""


    oRE.Global = True

    Dim sTest As String
    sTest = """Foo Bar"" ""Another Value"" something else"

    Debug.Assert oRE.test(sTest)

    Dim oMatchCol As VBScript_RegExp_55.MatchCollection
    Set oMatchCol = oRE.Execute(sTest)
    Debug.Assert oMatchCol.Count = 2

    Dim oMatch As Match
    For Each oMatch In oMatchCol
        Debug.Print oMatch.SubMatches(0)

    Next oMatch

End Sub
1 голос
/ 29 ноября 2011

От Грега Х. Я смог создать это регулярное выражение в соответствии со своими потребностями.

Мне нужно было сопоставить определенное значение, которое было определено в кавычках. Это должно быть полное совпадение, никакое частичное совпадение не может вызвать попадание

например. «test» не может соответствовать «test2».

reg = r"""(['"])(%s)\1"""
if re.search(reg%(needle), haystack, re.IGNORECASE):
    print "winning..."

Hunter

0 голосов
/ 02 марта 2018

Если вы пытаетесь найти строки, которые имеют только определенный суффикс, такой как точечный синтаксис, вы можете попробовать это:

\"([^\"]*?[^\"]*?)\".localized

Где .localized - суффикс.

Пример:

print("this is something I need to return".localized + "so is this".localized + "but this is not")

Он захватит "this is something I need to return".localized и "so is this".localized, но не "but this is not".

0 голосов
/ 05 октября 2008
echo 'junk "Foo Bar" not empty one "" this "but this" and this neither' | sed 's/[^\"]*\"\([^\"]*\)\"[^\"]*/>\1</g'

Это приведет к:> Foo Bar <> <> но это <</p>

Здесь я показал результирующую строку между> <для ясности, также используя не жадную версию с этой командой sed, мы сначала выбрасываем мусор до и после этого "", а затем заменяем его на часть между "" и окружить это символом> <. </p>

0 голосов
/ 02 октября 2011

У меня сработало вот это:

|([\'"])(.*?)\1|i

Я использовал следующее предложение:

preg_match_all('|([\'"])(.*?)\1|i', $cont, $matches);

и это прекрасно работало.

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