У меня есть файл в следующем формате:
Данные Данные Данные [Start]. Данные [Конец] Данные
Я'хотел бы взять Data I want
между тегами [Start]
и [End]
, используя Regex. Может ли кто-нибудь показать мне, как это можно сделать?
\[start\](.*?)\[end\]
Zhich'll поместить текст в середине в пределах захвата.
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]
Это, надеюсь, избавит вас от маркеров [начало]
и [конец]
.
В то время как Вы можете использовать регулярное выражение, чтобы разобрать данные между открытием и закрытием признаков, Вы должны хорошо подумать относительно того, является ли это путем, по которому Вы хотите идти. Причина его - потенциал признаков, чтобы гнездиться: если гнездящиеся признаки могли бы когда-либо происходить или могут когда-либо происходить, язык, как говорят, больше не регулярный, и регулярные выражения прекращают быть надлежащим инструментом для парсинга его.
Много внедрений регулярного выражения, таких как PCRE или perl' s регулярные выражения, возвращение поддержки, которое может использоваться, чтобы достигнуть этого грубого эффекта. Но PCRE (в отличие от жемчуга) doesn' t поддерживают неограниченное возвращение, и это может на самом деле вызвать вещи прервать странные пути, как только у Вас есть слишком много признаков.
There' s очень обычно цитируемое сообщение в блоге, которое обсуждает это больше, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (Google для него и проверяют тайник в настоящее время, у них, кажется, есть некоторое время простоя),
Более полное обсуждение ловушек использования 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
Ну, если Вы гарантируете, что каждый признак начала сопровождается конечным тэгом тогда, следующее работало бы.
\[start\](.*?)\[end\]
Однако, Если у Вас есть сложный текст, такой как follwoing:
[start] sometext [start] sometext2 [end] sometext [end]
тогда Вы столкнулись бы с проблемами с regex.
Теперь следующий пример вытащит все горячие связи на странице:
'/<a(.*?)a>/i'
В вышеупомянутом случае мы можем гарантировать, что не было бы никаких вложенных случаев:
'<a></a>'
Так, это - сложный вопрос и can' t просто быть решенным с простым ответом.
В 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
}
Обратитесь к этому вопросу вытащить текст между признаками с символами пробела и точками ('. ')
'[\S\s]' - тот, который я использовал
https://stackoverflow.com/questions/8303488/regex-to-match-any-character-including-new-lines
Чтение текста с в квадратных скобках [] т.е. [Начало] и [Конец] и утверждает множество со списком ценностей. < 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;
}