2016-11-29 5 views
3

У меня есть текст, как это:Regex, получить матч с конца

Какой-то парень пишет: некоторое содержание.

или

Какой-то парень сказал: некоторый контент.

и я хочу получить весь контент из «записей» до конца.

Это выглядит просто: (said | writes):. *

Но. Мой пример текста может выглядеть следующим образом:

пишет какой-то парень: блаблаб, сказал: некоторое содержание

Здесь я хочу, чтобы получить только сказал: некоторый контент. Но мое регулярное выражение получает все содержимое от 'пишет' до конца. Как решить эту проблему?

+0

Пожалуйста, пост код, который вы пробовали. –

+0

@SibeeshVenu: он есть и обозначен как код. (Хотя в конце есть пробел, который не должен быть.) – usr2564301

ответ

4

Prepend регулярное выражение вы с ^.* и захвата это:

^.*((?:said|writes):.*) 

См regex demo

Начальная .* будет захватывать всю строку (или строка если используется модификатор DOTALL) и будет возвращаться к said: или writes:, которые являются последними на строке/строке.

Группа не захвата в (?:said|writes) используется для группировки только для целей, так что существует только одна группа захвата с ID = 1.

Детали:

  • ^ - начало строки/строки якоря (зависит от используемых модификаторов)
  • .* - любые 0+ символов как можно больше (как * представляет собой жадный квантификатор) (кроме символов разрыва строки, если модификатор DOTALL не используется)
  • ((?:said|writes):.*) - Сбор 1 группы:
    • (?:said|writes) - либо said или writes символьные последовательности
    • : - двоеточие
    • .* - любые 0+ символы (кроме символов разрыва строки, если модификатор DOTALL не используется) до конца строки/строки ,
+0

Я не думаю, что вам нужен все '^. * 'см. мой ответ – Fallenhero

+0

, и ваша группа захвата является« необычной ». кроме этого, всегда хорошие ответы от вас – Fallenhero

+1

@Fallenhero: * Здесь я хочу получить только «сказал: некоторый контент». * Я не задал такие требования. –

1

Вы можете использовать регулярное выражение: ^.*(\b\w+:.*)$

Регулярное выражение захватывает группу с рисунком "<word>:<some content>$"

demo here

2

Я не думаю, что без определения того, что строка Расщепление вы могли бы это сделать с RegExp. Вы действительно должны укрепить шаблон для своей строки и обеспечить ее использование, но вот программный способ анализа ваших строк.

const writes = 'Some guy writes: some content.' 
 
const said = 'Some guy said: some content.' 
 
const blah = 'Some guy writes: blablabla, said: some content' 
 

 
function objectifyString(str) { 
 
    const reg = /(said|writes):/ 
 
    const index = str.search(reg) || 0 
 
    const parts = str.substring(index).split(reg).filter(item => item.length) 
 
    const obj = {} 
 
    const ll = parts.length 
 
    let ii = 0 
 
    
 
    for (; ii < ll; ii+=2) { 
 
    obj[parts[ii]] = (parts[ii+1]).trim() 
 
    } 
 
    return obj 
 
} 
 

 
console.log(
 
    objectifyString(blah) 
 
) 
 
console.log(
 
    [writes, said, blah].map(objectifyString) 
 
)

+0

Мой текст можно разделить не только запятой, это может быть пробел или любые другие символы –

1

вот ваш ответ:

var text = "Some guy writes: blablabla, said: some content"; 

var output = /.*\s(\w+:.*)/.exec(text); 
// output[1] contains your answer 
Смежные вопросы