2014-11-16 3 views
1

Я пытаюсь найти подстроку между двумя словами, но в моем стартовом слове есть апостроф, и я не могу найти его.Перейти regexp найти слово с апострофом

К примеру, в этом следующем предложении

bus driver drove steady although the bus's steering was going nuts. 

правильный ответ на мой поиск должен быть:

steering was going nuts 

и нет:

driver ... nuts 

Я попробовал этот

re := regexp.MustCompile("(?s)bus[\\\'].*?nuts") 

Я также попытался это:

re := regexp.MustCompile("(?s)bus'.*?nuts") 

Не могу заставить его работать.

+0

Спасибо за ответы. Я понял, что моя ошибка проистекала из класса символов текста, который я разбираю. – Suchintya

+0

Бит бесстыдный, но я ранее написал пакет именно для этой цели (вытащил любой текст между двумя строками/байтовыми фрагментами): https://github.com/AlasdairF/Between – Alasdair

ответ

0

Вы можете использовать string literal (с задней цитатой) для того, чтобы включить апостроф, с захватом группой:

re := regexp.MustCompile(`(?s)bus'.\s+(.*?nuts)`) 

См this example:

var source_txt = `bus driver drove steady although the bus's steering was going nuts.` 

func main() { 
    fmt.Printf("Experiment with regular expressions.\n") 
    fmt.Printf("source text:\n") 
    fmt.Println("--------------------------------") 
    fmt.Printf("%s\n", source_txt) 
    fmt.Println("--------------------------------") 

    // a regular expression 
    regex := regexp.MustCompile(`(?s)bus'.\s+(.*?nuts)`) 
    fmt.Printf("regex: '%v'\n", regex) 
    matches := regex.FindStringSubmatch(source_txt) 
    for i, v := range matches { 
     fmt.Printf("match %2d: '%s'\n", i+1, v) 
    } 
} 

Выход:

Experiment with regular expressions. 
source text: 
-------------------------------- 
bus driver drove steady although the bus's steering was going nuts. 
-------------------------------- 
regex: '(?s)bus'.\s+(.*?nuts)' 
match 1: 'bus's steering was going nuts' 
match 2: 'steering was going nuts' 

FindStringSubmatch():

идентификации крайний левый матч регулярного выражения в s- и матчи, если таковые имеются, его подвыражения

match[1] будет первым группа записи.

+0

Как вы уже знаете, это была не цитата , это проблема с регулярным выражением. =) – hwnd

+0

@hwnd true. +1 к вашему ответу. Однако я всегда предпочитаю использовать строковый литерал для своего регулярного выражения. – VonC

2

Правильный ответ на мой поиск должен быть "steering was going nuts" ...

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

re := regexp.MustCompile("(?s)bus's (.*?nuts)") 
rm := re.FindStringSubmatch(str) 
if len(rm) != 0 { 
    fmt.Printf("%q\n", rm[0]) // "bus's steering was going nuts" 
    fmt.Printf("%q", rm[1]) // "steering was going nuts" 
} 

GoPlay

Смежные вопросы