2015-02-24 2 views
1

Я начинаю новичок и играю с регулярными выражениями. Пример:Перейти regexp: найти следующий элемент после появления

r, _ := regexp.Compile(`\* \* \*`) 
r2 := r.ReplaceAll(b, []byte("<hr>")) 

(Заменить все * * * с для <hr> с)

Единственное, что я понятия не имею, как это сделать, чтобы найти next пункт после встречаемости. В JavaScript/JQuery Я использовал, чтобы сделать это:

$("#input-content p:has(br)").next('p').doStuff() 

(Найти следующий ptag после p тега, который имеет br тег внутри).

Какой самый простой способ выполнить то же самое в Go? Скажем, найти следующую строку после * * *?

* * * 

Match this line 

ответ

1

Вы должны были бы использовать захват группу грейферов содержания этого предложения:

package main 

import "fmt" 
import "regexp" 

func main() { 

    str := ` 
* * * 

Match this line 
` 
    r, _ := regexp.Compile(`\* \* \*\n.*\n(.*)`) 

    fmt.Println(r.FindStringSubmatch(str)[1]) 
} 

Выход:

Match this line 

Объяснение:

\* \* \* Matches the first line containing the asterisks. 
\n   A newline. 
.*   Second line. Can be anything (Likely the line is simply empty) 
\n   A newline 
(   Start of capturing group 
.*   The content of interest 
)   End of capturing group 

В комментариях вы спросили, как заменить третью линию <hr/>. В этом случае я бы использовал две группы захвата - одну для части перед интересующей линией и одну для самой линии. В шаблоне замены вы можете использовать $1, чтобы использовать значение первой группы захвата в результате.

Пример:

package main 

import "fmt" 
import "regexp" 

func main() { 

    str := ` 
* * * 

Match this line 
` 
    r, _ := regexp.Compile(`(\* \* \*\n.*\n)(.*)`) 

    str = string(r.ReplaceAll([]byte(str), []byte("$1<hr/>"))) 

    fmt.Println(str) 
} 
+0

Эй, спасибо это сработало. Только один вопрос. Я использовал 'r.ReplaceAll (b, [] byte ("


"))' вместо этого, но даже '* * *' был заменен. Связано ли это с частью '[1]' в вашем коде? Если да, то как обновить мой код, чтобы '* * *' не был заменен? – alexchenco