kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Dan
Dan
Вопрос

Регекс: Для извлечения подстроки между двумя тегами в строке

У меня есть файл в следующем формате:

Данные Данные
Данные
[Start].
Данные
[Конец]
Данные

Я'хотел бы взять Data I want между тегами [Start] и [End], используя Regex. Может ли кто-нибудь показать мне, как это можно сделать?

45 2008-08-04T13:47:10+00:00 9
Aditi Parikh
Aditi Parikh
Редактировал вопрос 14-го сентября 2017 в 7:01
Программирование
regex
parsing
Karl Seguin
Karl Seguin
4-го августа 2008 в 1:52
2008-08-04T13:52:06+00:00
Дополнительно
Источник
Редактировать
#8407373
\[start\](.*?)\[end\]

Zhich'll поместить текст в середине в пределах захвата.

 YCF_L
YCF_L
Редактировал ответ 18-го сентября 2017 в 1:36
63
0
Решение / Ответ
Xenph Yan
Xenph Yan
4-го августа 2008 в 1:55
2008-08-04T13:55:05+00:00
Дополнительно
Источник
Редактировать
#8407374
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

Это, надеюсь, избавит вас от маркеров [начало] и [конец].

 YCF_L
YCF_L
Редактировал ответ 18-го сентября 2017 в 1:35
23
0
 PhaZe
PhaZe
6-го октября 2012 в 4:52
2012-10-06T16:52:08+00:00
Дополнительно
Источник
Редактировать
#8407380
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

У меня была подобная проблема некоторое время & я могу сказать Вам этот метод работы...

5
0
Daniel Papasian
Daniel Papasian
15-го сентября 2008 в 2:18
2008-09-15T14:18:27+00:00
Дополнительно
Источник
Редактировать
#8407377

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

Много внедрений регулярного выражения, таких как PCRE или perl' s регулярные выражения, возвращение поддержки, которое может использоваться, чтобы достигнуть этого грубого эффекта. Но PCRE (в отличие от жемчуга) doesn' t поддерживают неограниченное возвращение, и это может на самом деле вызвать вещи прервать странные пути, как только у Вас есть слишком много признаков.

There' s очень обычно цитируемое сообщение в блоге, которое обсуждает это больше, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (Google для него и проверяют тайник в настоящее время, у них, кажется, есть некоторое время простоя),

4
0
Jon Ericson
Jon Ericson
20-го августа 2008 в 7:14
2008-08-20T19:14:19+00:00
Дополнительно
Источник
Редактировать
#8407376

Более полное обсуждение ловушек использования regex, чтобы найти соответствие признакам может быть найдено в: < http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi>. в частности, знайте, что гнездящимся признакам действительно нужен полноценный анализатор, чтобы интерпретироваться правильно.

Обратите внимание, что чувствительность к регистру должна будет быть выключена, чтобы ответить на вопрос, как указано. В жемчуге, that' s я модификатор:

$ echo "Data Data Data [Start] Data i want [End] Data" \
  | perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
 Data i want 

Другая уловка должна использовать *? квантор, который выключает жадность захваченного матча. Например, если у Вас есть несоответствие [конец] признак:

Data Data [Start] Data i want [End] Data [end]

Вы, вероятно, don' t хотят захватить:

 Data i want [End] Data
4
0
 un33k
un33k
11-го мая 2009 в 8:08
2009-05-11T20:08:30+00:00
Дополнительно
Источник
Редактировать
#8407378

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

\[start\](.*?)\[end\]

Однако, Если у Вас есть сложный текст, такой как follwoing:

[start] sometext [start] sometext2 [end] sometext [end]

тогда Вы столкнулись бы с проблемами с regex.

Теперь следующий пример вытащит все горячие связи на странице:

'/<a(.*?)a>/i'

В вышеупомянутом случае мы можем гарантировать, что не было бы никаких вложенных случаев:

'<a></a>'

Так, это - сложный вопрос и can' t просто быть решенным с простым ответом.

3
0
 Grant
Grant
4-го августа 2008 в 2:00
2008-08-04T14:00:04+00:00
Дополнительно
Источник
Редактировать
#8407375

В Perl вы можете окружить нужные вам данные символами ()'и вытащить их позже, возможно, в других языках есть подобная возможность.

if ($s_output =~ /(data data data data START(data data data)END (data data)/) 
{
    $dataAllOfIt = $1;      # 1 full string
    $dataInMiddle = $2;     # 2 Middle Data
    $dataAtEnd = $3;        # 3 End Data
}
brian  d foy
brian d foy
Редактировал ответ 12-го октября 2008 в 12:21
1
0
 ankitkpd
ankitkpd
28-го августа 2013 в 9:12
2013-08-28T21:12:48+00:00
Дополнительно
Источник
Редактировать
#8407381

Обратитесь к этому вопросу вытащить текст между признаками с символами пробела и точками ('. ')

'[\S\s]' - тот, который я использовал

https://stackoverflow.com/questions/8303488/regex-to-match-any-character-including-new-lines

 Community
Community
Редактировал ответ 23-го мая 2017 в 11:46
0
0
N  Murali Mohan
N Murali Mohan
12-го сентября 2014 в 8:26
2014-09-12T08:26:38+00:00
Дополнительно
Источник
Редактировать
#8407382

Чтение текста с в квадратных скобках [] т.е. [Начало] и [Конец] и утверждает множество со списком ценностей. < b> jsfiddle

var mergeFields = ["[sitename]",
                   "[daystoholdquote]",
                   "[expires]",
                   "[firstname]",
                   "[lastname]",
                   "[sitephonenumber]",
                   "[hoh_firstname]",
                   "[hoh_lastname]"];       

var str = "fee [sitename] [firstname] \
sdfasd [lastname] ";
var res = validateMeargeFileds(str);
console.log(res);

function validateMeargeFileds(input) {
    var re = /\[\w+]/ig;
    var isValid;
    var myArray = input.match(re);

    try{
        if (myArray.length > 0) {
            myArray.forEach(function (field) {

                isValid = isMergeField(field);

                if (!isValid){
                   throw e;                        
                }
            });
        }
    }
    catch(e) {        
    }

    return isValid;
}

function isMergeField(mergefield) {
    return mergeFields.indexOf(mergefield.toLowerCase()) > -1;
}
Markus Safar
Markus Safar
Редактировал ответ 7-го февраля 2016 в 12:38
0
0
Похожие сообщества 1
Regular Expressions
Regular Expressions
1 044 пользователей
Chat about the Regular Expressions. Please use https://regexr.com https://regex101.com for share your regexes. For practice use: https://regexcrossword.com https://regexone.com
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 2 дня назад
2
Денис Васьков
Зарегистрирован 4 дня назад
3
Dima Patrushev
Зарегистрирован 6 дней назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
JA
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией