정규식:문자열의 두 태그 사이에 있는 하위 문자열을 꺼내려면
문제
다음 형식의 파일이 있습니다.
Data Data Data [Start] Data I want [End] Data
나는 그것을 잡고 싶다 Data I want
사이에서 [Start]
그리고 [End]
Regex를 사용하는 태그.누구든지 이것이 어떻게 수행되는지 보여줄 수 있습니까?
해결책
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]
그러면 [start]
그리고 [end]
마커도.
다른 팁
\[start\](.*?)\[end\]
Zhich는 캡처 내에서 텍스트를 중앙에 배치합니다.
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;
나는 한동안 비슷한 문제를 겪었고 이 방법이 효과가 있다고 말할 수 있습니다 ...
일치하는 태그를 찾기 위해 정규식을 사용할 때의 함정에 대한 보다 완전한 논의는 다음에서 찾을 수 있습니다. http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi.특히 중첩 태그를 올바르게 해석하려면 본격적인 파서가 필요하다는 점에 유의하세요.
명시된 대로 질문에 답하려면 대소문자 구분을 꺼야 합니다.펄에서는 이것이다 나 수정자:
$ 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]
아마도 다음을 캡처하고 싶지 않을 것입니다.
Data i want [End] Data
정규식을 사용하여 여는 태그와 닫는 태그 사이의 데이터를 구문 분석할 수 있지만 이것이 가고 싶은 경로인지에 대해 오랫동안 열심히 생각해야 합니다.그 이유는 태그가 중첩될 가능성이 있기 때문입니다.중첩 태그가 발생할 수 있거나 발생할 수 있는 경우 해당 언어는 더 이상 정규적이지 않으며 정규식은 더 이상 구문 분석에 적합한 도구가 아닙니다.
PCRE 또는 Perl의 정규식과 같은 많은 정규식 구현은 이러한 대략적인 효과를 달성하는 데 사용할 수 있는 역추적을 지원합니다.그러나 PCRE(perl과 달리)는 무제한 역추적을 지원하지 않으며 이로 인해 실제로 태그가 너무 많으면 이상한 방식으로 문제가 발생할 수 있습니다.
이에 대해 더 자세히 논의하는 매우 일반적으로 인용되는 블로그 게시물이 있습니다. http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (Google에서 현재 캐시를 확인해 보니 가동 중지 시간이 있는 것 같습니다.)
글쎄요, 각 시작 태그 뒤에 종료 태그가 오는 것을 보장한다면 다음이 작동할 것입니다.
\[start\](.*?)\[end\]
그러나 다음과 같이 복잡한 텍스트가 있는 경우:
[start] sometext [start] sometext2 [end] sometext [end]
그러면 정규식에 문제가 발생합니다.
이제 다음 예에서는 페이지의 모든 핫 링크를 가져옵니다.
'/<a(.*?)a>/i'
위의 경우 다음과 같은 중첩 사례가 발생하지 않음을 보장할 수 있습니다.
'<a></a>'
그러므로 이것은 복잡한 질문이고 단순한 대답만으로는 해결될 수 없습니다.
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
}
대괄호 [], 즉 [Start] 및 [End] 안의 텍스트를 읽고 값 목록으로 배열의 유효성을 검사합니다. jsfiddle http://jsfiddle.net/muralinarisetty/r4s4wxj4/1/
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;
}