문제

나는 구체적으로 A TAG의 텍스트로 /를 채우려고 노력하고 있습니다.

1234/1234/ABCDE => 1234 / 1234 / ABCDE

문맥; 태그가있는 경우 :

<a href="http://www.domain.com/path/to/page.html">12 34/1234A/BC DEFG</a>

나는 얻고 싶다 :

<a href="http://www.domain.com/path/to/page.html">12 34 / 1234A / BC DEFG</a>
도움이 되었습니까?

해결책

이 regex는 트릭을 수행해야합니다.

(\s*/\s*(?=[^<>]+<))

만 교체합니다 '/' URL이 아닌 태그 내에서.

C#:

 myHtml = Regex.Replace(myHtml, @"(\s*/\s*(?=[^<>]+<))", " / ");

Perl에서 :

$myHtml =~ s!(\s*/\s*(?=[^<>]+<))! / !g;

JavaScript :

myHtml = myHtml.replace(/(\s*\/\s*(?=[^<>]+<))/g, " / ");

메모:

이 예에서는 전체 문서가 myHtml 끈.
한 번에 한 줄로 작업하면 태그 내부에 최신이 있거나 태그 사이의 태그 쌍이 있으면 작동하지 않습니다.

다른 팁

이것은 실제로 정규 표현이 잘하는 일이 아닙니다. HTML 또는 XML 파서를 사용하는 것이 더 나을 것입니다. 문서에서 노드 트리를 생성 한 다음 태그 내부에있는 모든 텍스트 노드를 밟고 필요에 따라 공백을 추가 할 수 있습니다.

필요한 경우, REGEX를 사용하여 두 개의 태그 사이의 텍스트를 추출한 다음 처리 한 다음 다시 삽입 할 수 있지만이 작업은 제약으로 인해 단일 정규식보다 더 복잡 할 수 있습니다.

다음은 Perl에서 작동하는 것이 있습니다 (그러나 Regexes를 사용하지 않음).

my (@a, $in_tag);
foreach(split //, $string) { # assuming $string holds our string
  $in_tag = 1 if $_ eq "<";
  $in_tag = 0 if $_ eq ">";
  if($_ eq "/" and not $in_tag) {
    push @a, " ", "/", " ";
  }
  else {
    push @a, $_;
  }
}
$string = join "", @a;

그러나 이것은 정규식이 아니라 매우 간단한 파서입니다.

나는 우리가 여기서 약간의 맥락이 부족하다고 생각합니다. 데이터 HTML, XML 또는 태그가있는 텍스트 조각입니까?

HTML 또는 XML 인 경우 자주 언급 한 바와 같이, 데이터의 형식을 정확하게 제어하지 않는 한 Regexps는 안전하지 않으며 항상이를 제어한다는 것을 알고 있습니다. 그리고 당신은 그것을 문서화합니다.

내가 당신이라면 적절한 파서를 사용할 것입니다. Perl 및 XML :: Twig가 설치된 경우 다음 1 라이너가 수행됩니다.

perl -MXML::Twig -e'XML::Twig->parse( keep_spaces => 1, "my_file.xml")->subs_text( "/", " / ")->print'

주석과 CDATA 섹션이없는 잘 형성된 XML을 다루는 경우보다 효율적인 방법은 PYX를 사용하는 것입니다 (XML :: PYX를 설치해야 함) :

pyx my_file.xml | perl -p -e's{/}{ / }g if m{-}' | pyxw

어떤 언어? Perl에서 시도하십시오 s/\// \/ /g.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top