2015-12-20 4 views
7

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

У меня есть следующий тег: < | и |>, и я хочу выбрать только текст если это между «и между тегами».

< | бла-бла-бла «должен быть выбран» не выбрано «выберите его слишком» |> «не выбран слишком»

Я думаю, что что-то о

(\<\|)(\").*?(\")(\|\>) 

Но это не работает.

+0

@nicael вы даже читать вопрос? OP хочет выбирать значения между кавычками только в том случае, если их внутренние теги '<|' '|>' –

+0

Да, его не дублируют, я не хочу выбирать какой-либо текст внутри "", я хочу выбрать текст внутри "" и <| |> и его JS и C# – magallanes

+0

@ M.kazemAkhgary это не имеет значения, решение легко настраивается. Вы только представляете, что '<|' and '|>' - это другие кавычки и улучшают регулярное выражение. – nicael

ответ

4

Это будет выполнять работу в одном регулярном выражении:

(?<=<\|[^>]*)"[^"]*"

В дополнение к комментарию nicael: Возможно, что входная строка ing не помечен правильно.Это поможет:

(?<=<\|((?!\|>).)*)"[^"]*"

Если вам нужно использовать его с JavaScript:

(?=("[^"]*"[^"]*)*$)"[^"]*"(?=((?!<\|).)*\|>)

+0

Выглядит отлично, но почему он не работает [там] (http://regexr.com/3cet3)? На мобильных устройствах, возможно, отобразится ошибка. – nicael

+0

Обнаружена проблема в регулярном выражении: [this] (http://regexstorm.net/tester?p= (% 3f% 3c% 3% 3c% 5c% 7c% 5b% 5e% 3e% 5d *)% 22% 5б% 5e% 22% 5d *% 22 & я =% 3c% 7c + ли + ли + ли +% 22should + быть + выбран% 22 + не + выбранными +% 22select + It + слишком% 22 +% 3e +% 22not + выбрано + слишком % 22 +% 3c% 7c +% 22test% 22 +% 7c% 3e +% 22wrong + match% 22 +) не соответствует правильно. Я заменил first |> на>, это должно привести к тому, что «не выбран» слишком, чтобы соответствовать, хотя это не так. – nicael

+0

@nicael Я добавил регулярное выражение, которое решает вторую проблему. Мое регулярное выражение будет работать с регулярным выражением .Net. В примере с вашим кулаком показано, что в JavaScript не учитываются утверждения за утверждениями. Сожалею. Что это? Есть регулярное выражение, которое не поддерживает внешний вид? Я пытаюсь найти решение, которое работает с учетом ожиданий. –

6

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

var input = '<|a "b"|>c "d"ef<|"g"h "i"|>"j"k l'; 
 
var output=input.match(/<\|(.*?)\|>/g) 
 
    .map(function(x){return x.match(/"(.*?)"/g)}) 
 
alert(output)

Как вы можете видеть, правильно соответствует "б", "г", "я".

Принцип:

  1. найти все матчи текста между <| и |>
  2. на каждый матч с первого шага, найти спички текста между двумя кавычками.

(используется регулярное выражение из second answer от linked вопроса)

+0

К сожалению, жадные кванторы '*' будут использовать первую пару '<|', '|>', если присутствуют несколько: https://regex101.com/r/wI4lF2/1 –

+0

@Jan hm, похоже, это проблема. Протестировано с использованием примера OP. – nicael

+0

@Jan отредактировал: как ответ упоминал javascript, использовал его :) – nicael

2

Попробуйте с просмотровых-задом и смотреть-aheads:

(?<=\<\|.)(\"[^"]*\")(?=.\|\>) 

Regular expression visualization

Вот live demo.

+0

Неверно! посмотрите пример [this] (https://www.debuggex.com/r/X0X40tbmW4jSIEHd). – fardjad

+0

@fardjad о, вы правы. Ответ на nicael также не подходит к вашему примеру. У вас есть лучшие предложения? –

+0

Да, но не с одним регулярным выражением, я отправлю свое решение через минуту. – fardjad

3

I can't think of a regular expression to match what you want in one shot, но я не вижу причин, чтобы не делать это с двумя регулярными выражениями:

var SAMPLE_STRING = '<| blah blah blah "should be selected" not selected "select it too" |> "not selected too" <| "select it" do not select this |> "don\'t select this one too"'; 
 

 
var matchAll = function matchAll(regexp, str) { 
 
    var lastIndex = regexp.lastIndex; 
 
    regexp.lastIndex = 0; 
 
    var result = []; 
 
    var match; 
 
    while ((match = regexp.exec(str)) !== null) { 
 
    result.push(match[0]); 
 
    } 
 
    regexp.lastIndex = lastIndex; // so this method won't have any side effects on the passed regexp object 
 
    return result; 
 
}; 
 

 
var withinTagsRegexp = /<\|([^|]|\|[^>])+\|>/g; 
 
var withinQuotesRegexp = /"[^"]+"/g; 
 

 
var withinTagsAndQuotes = [].concat.apply([], // flattens the following 
 
    matchAll(withinTagsRegexp, SAMPLE_STRING).map(
 
    matchAll.bind(undefined, withinQuotesRegexp))); 
 

 
// show the result 
 

 
var resultTag = document.getElementById('result'); 
 

 
withinTagsAndQuotes.forEach(function(entry) { 
 
    var p = document.createElement('p'); 
 
    p.innerHTML = entry; 
 
    resultTag.appendChild(p); 
 
});
<div id="result"></div>

+1

Подождите, как вам удалось сделать это так долго: P – nicael

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