2014-01-02 9 views
0

Предполагая, что у меня есть эта строка:Получить первую часть строки, используя регулярное выражение?

blabla1 blabla2#blabla1 blabla2#blabla1 blabla2#blabla1 blabla2#blabla1 blabla2

я могу получить эту часть:

enter image description here

Via [^#]+$

(test)

Visualize:

enter image description here

Вопрос:

Как я могу получить (с помощью регулярных выражений) другой часть (за исключением последнего #)?

enter image description here

ответ

4

Я думаю, с опережающим просмотром

(.*)(?=#[^#]+$) 
+0

Я всегда думаю, что прекрасно знаю этот взгляд вперед (я пытался с негативным взглядом), и я в основном терпеть неудачу с ним. Я не знаю, почему мои инстинкты всегда предупреждают: «negative lookahead» .... :-( –

+0

Может '[^ #]' также использоваться для «не содержащего слова« abc »? Я имею в виду - это действительно [^(abc)] '? –

+0

@RoyiNamir: no, класс символов' [...] 'всегда соответствует одному символу. – georg

1
/(.*)#[^#]*$/ 

В результате ваш первый захват, не весь матч.

/(.*)#[^#]*$/.exec("foo#bar baz#qux quz")[1] === "foo#bar baz" 

Еще лучше:

/^(.*)#([^#]*)$/ 

Если вы секционирование строки для некоторой целенаправленной деятельности, вы, вероятно, на самом деле не хотите бросить последний фунт и текст, который следует за ним - нужно просто обрабатывать его отдельно. Даже если вы хотите, чтобы процедуры, которые обрабатывали каждую часть, разделяли ее отдельно (например, чтобы вы могли передать им одну и ту же строку вместо массива), вы не хотите иметь регулярное выражение - любая часть любого regex - дважды появляются в вашем источнике. Они имеют тенденцию быть только для записи и подвержены ошибкам, поэтому каждое место, которое оно появляется, - это то, что вы, вероятно, перепишете и, возможно, испортите, когда перейдете к его пересмотру.

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

С точки зрения того, что эта задача является полностью упражнением, по-прежнему важно знать, что в дополнение к тому, что вы хотите, вы также можете использовать регулярное выражение для в соответствии с тем, что вы не хотите и захватить остальное.

+0

Не работает. http://i.stack.imgur.com/QLCoN.png –

+0

Конечно. Результатом является первый захват, а не весь матч. – sqykly

+0

О, я вижу. да, это действительно работает. Спасибо –

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