/(.*)#[^#]*$/
В результате ваш первый захват, не весь матч.
/(.*)#[^#]*$/.exec("foo#bar baz#qux quz")[1] === "foo#bar baz"
Еще лучше:
/^(.*)#([^#]*)$/
Если вы секционирование строки для некоторой целенаправленной деятельности, вы, вероятно, на самом деле не хотите бросить последний фунт и текст, который следует за ним - нужно просто обрабатывать его отдельно. Даже если вы хотите, чтобы процедуры, которые обрабатывали каждую часть, разделяли ее отдельно (например, чтобы вы могли передать им одну и ту же строку вместо массива), вы не хотите иметь регулярное выражение - любая часть любого regex - дважды появляются в вашем источнике. Они имеют тенденцию быть только для записи и подвержены ошибкам, поэтому каждое место, которое оно появляется, - это то, что вы, вероятно, перепишете и, возможно, испортите, когда перейдете к его пересмотру.
Вот почему я не буду делать утверждения в прямом выражении - регулярное выражение для извлечения текста за последние #
будет идентичным тому, которое вы используете для получения текста перед ним, но прямое утверждение будет заменено так, чтобы последний часть является частью матча. Обычно я не разделяю строки, у которых есть несущественные части, поэтому я хочу, чтобы совпадение представляло собой целую строку, а части, которые мне нужно исследовать отдельно в отдельных захватах.
С точки зрения того, что эта задача является полностью упражнением, по-прежнему важно знать, что в дополнение к тому, что вы хотите, вы также можете использовать регулярное выражение для в соответствии с тем, что вы не хотите и захватить остальное.
Я всегда думаю, что прекрасно знаю этот взгляд вперед (я пытался с негативным взглядом), и я в основном терпеть неудачу с ним. Я не знаю, почему мои инстинкты всегда предупреждают: «negative lookahead» .... :-( –
Может '[^ #]' также использоваться для «не содержащего слова« abc »? Я имею в виду - это действительно [^(abc)] '? –
@RoyiNamir: no, класс символов' [...] 'всегда соответствует одному символу. – georg