programing

주석에 포함되지 않은 경우 특정 내용을 선택하는 정규식

codeshow 2023. 9. 14. 23:44
반응형

주석에 포함되지 않은 경우 특정 내용을 선택하는 정규식

패턴 src="*.js"와 일치하는 정규 표현식을 찾고 있지만, 이는 코멘트에 포함되지 않아야 합니다.

다음과 같이 생각합니다.

<!------<script type="text/javascript" src="js/Shop.js"></script>  -->
<!----<script type="text/javascript" src="js/Shop.js"></script>  -->
<script type="text/javascript" src="jquery.serialize-object.js"></script>
<script type="text/javascript" src="jquery.cookie.js"></script>

OP에 의해 "올바른" 것으로 설명된 확장된 샘플 입력:

<!------<script type="text/javascript" src="js/Shop.js"></script>  -->
<!----<script type="text/javascript" src="js/Shop.js"></script>  -->
<script type="text/javascript" src="jquery.serialize-object.js"></script><!---->
<script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment -- afterwards -->
<script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment starting but not ending
-- afterwards -->
<script type="text/javascript" src="jquery.serialize-object.js"></script>
<script type="text/javascript" src="jquery.cookie.js"></script>

결과가 1행과 2행(내용에 주석이 포함된 경우)과 일치하지 않아야 합니다.3행과 4행만 일치해야 합니다(확장 샘플 입력의 경우 주석-끝행은 제외).

내 .이 있지만,합니다: 까지 는 과 하는 을 이 를 하는 를 을 과 (src=\")+(\S)+(.js)

댓글로 둘러싸여 있지 않은 .jsrc 속성의 스크립트 태그만 선택하는 regex를 찾고 있습니다.

또한 Oracle PL SQL 쿼리에서 이 정규 표현식을 사용하고 있음을 언급하고자 합니다.

특히 오라클의 정규 표현식 구현은 룩어라운드를 지원하지 않기 때문에 정규 표현식 하나로 원하는 작업을 수행할 수 있을지 모르겠습니다.그러나 이러한 한계를 극복하기 위해 SQL로 수행할 수 있는 몇 가지 방법이 있습니다.한 다음 저고을켜에다를한서e,를한e에은rgtnse저egtl켜gr서을을ym고ssrc=".*\.js" 결과를 ⑤ ⑥ ⑦ 검색합니다 결과여러 다음 사용하여 에를 이용하여 검색합니다.CONNECT BY:

SELECT html_id, REGEXP_SUBSTR(clean_html, 'src=".*\.js"', 1, LEVEL, 'i') AS match
  FROM (
    SELECT html_id, REGEXP_REPLACE(html_text, '<!--.*?-->', '', 1, 0, 'n') AS clean_html
      FROM (
        SELECT 1 AS html_id, '<!------<script type="text/javascript" src="js/Shop.js"></script>  -->
        <!----<script type="text/javascript" src="js/Shop.js"></script>  -->
        <script type="text/javascript" src="jquery.serialize-object.js"></script><!---->
        <script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment -- afterwards -->
        <script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment starting but not ending
        -- afterwards -->
        <script type="text/javascript" src="jquery.serialize-object.js"></script>
        <script type="text/javascript" src="jquery.cookie.js"></script>' AS html_text
          FROM dual
    )
)
CONNECT BY REGEXP_SUBSTR(clean_html, 'src=".*\.js"', 1, LEVEL, 'i') IS NOT NULL
   AND PRIOR html_id = html_id
   AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;

이러한 결과가 테이블 어딘가에 저장되어 있으면 다음 작업을 수행합니다.

SELECT html_id, REGEXP_SUBSTR(clean_html, 'src=".*\.js"', 1, LEVEL, 'i') AS match
  FROM (
    SELECT html_id, REGEXP_REPLACE(html_text, '<!--.*?-->', '', 1, 0, 'n') AS clean_html
      FROM mytable
)
CONNECT BY REGEXP_SUBSTR(clean_html, 'src=".*\.js"', 1, LEVEL, 'i') IS NOT NULL
   AND PRIOR html_id = html_id
   AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;

이상하지만 중복되는 결과를 피하기 위해서는 마지막 두 줄이 필요합니다.

결과는 다음과 같습니다.

| HTML_ID | MATCH                              |
+---------+------------------------------------+
|       1 | src="jquery.serialize-object.js"   |
|       1 | src="jquery.serialize-object.js"   |
|       1 | src="jquery.serialize-object.js"   |
|       1 | src="jquery.serialize-object.js"   |
|       1 | src="jquery.cookie.js"             |
+---------+------------------------------------+

SQL Fiddle Here.

도움이 되길 바랍니다.

편집: 아래 제 의견에 따라 편집됨:

SELECT html_id, REGEXP_SUBSTR(clean_html, 'src="[^"]*\.js"', 1, LEVEL, 'i') AS match
  FROM (
    SELECT html_id, REGEXP_REPLACE(html_text, '<!--.*?-->', '', 1, 0, 'n') AS clean_html
      FROM (
        SELECT 1 AS html_id, '<!------<script type="text/javascript" src="js/Shop.js"></script>  -->
        <!----<script type="text/javascript" src="js/Shop.js"></script>  -->
        <script type="text/javascript" src="jquery.serialize-object.js"></script><!---->
        <script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment -- afterwards -->
        <script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment starting but not ending
        -- afterwards -->
        <script type="text/javascript" src="jquery.serialize-object.js"></script>
        <script type="text/javascript" src="jquery.cookie.js"></script>' AS html_text
          FROM dual
    )
)
CONNECT BY REGEXP_SUBSTR(clean_html, 'src="[^"]*\.js"', 1, LEVEL, 'i') IS NOT NULL
   AND PRIOR html_id = html_id
   AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;

편집됨

당신이 을 CLOBCHAR열의 첫 줄,줄째의줄,nf째의eete,CONNECT BY조항은 이렇게 보여야 합니다.REGEXP_SUBSTR()를 합니다.CLOB당인이우인e우afs이당anCLOB 이 : , 는 이 이 는

CONNECT BY DBMS_LOB.SUBSTR(REGEXP_SUBSTR(clean_html, 'src="[^"]*\.js"', 1, LEVEL, 'i'), 4000, 1) IS NOT NULL

도움이 되길 바랍니다.

예를 들어 이 샘플 입력의 경우:

<!------<script type="text/javascript" src="js/Shop.js"></script>  -->
<!----<script type="text/javascript" src="js/Shop.js"></script>  -->
<script type="text/javascript" src="jquery.serialize-object.js"></script><!---->
<script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment -- afterwards -->
<script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment starting but not ending
-- afterwards -->
<script type="text/javascript" src="jquery.serialize-object.js"></script>
<script type="text/javascript" src="jquery.cookie.js"></script>

:src="[^"]*\.js\"></script>(\s*<!--[^>]*-->)*(\s*<!--[^>]*)?$
다음과 같은 출력을 제공합니다.

<script type="text/javascript" src="jquery.serialize-object.js"></script><!---->
<script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment -- afterwards -->
<script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment starting but not ending
<script type="text/javascript" src="jquery.serialize-object.js"></script>
<script type="text/javascript" src="jquery.cookie.js"></script>

테스트를 해봤습니다.GNU grep 2.5.4맛에 ., 의 regex 에 를 에 를 의 .정규석은 특별한 특징으로 매우 가볍습니다.

설명:

  • \"[^"]* 안에 있는 에"입니다""
  • (<!--[^>]*-->)*는, 는약지면이한들의든한들의sy,"든nfsy는rfte ">"
  • (<!--[^>]*)?$"non-slot "-slot "는적의 선택적 시작"입니다.>에 코멘트 에줄"
  • \s* 허용g

관련 입력의 복잡성이 발생할 수 있는 어느 시점에서 정규화는 올바른 도구가 되지 못합니다.Beyond, 전용 툴, 즉 XML/html용 파서는 무엇이든 선택할 수 있습니다.
저는 관련 입력이 여러 줄로 된 주석 안에서 "숨겨질" 가능성이 있을 때 그 시점에 도달합니다.먼저 한 줄에서 관련 입력을 기대할 수 있다는 것을 확인하고(뒤에 시작하는 코멘트와는 별도로), 반대되는 샘플 입력을 추가하여 규칙을 변경함으로써 질문을 움직이는 대상으로 전환했다고 생각합니다.어느 시점에서 당신은 제가 제안한 샘플 입력을 "올바른" 것으로 설명했습니다.
댓글에 연결된 QA(아주 재미있는) XML/regex에 대해 토론하는 모습은 일찍 선을 긋지 않으면 결과를 초래할 수 있음을 보여줍니다.
특정 환경(예: SQL 서버)으로 제한될 경우 해당 환경의 특수한 기능을 활용해야 합니다.메커니즘통해 입력언급되지 않은 부분을 처리하여 목표를 높은 달성할 수 있습니다 단계 달성있습니다 i sql your of in 목표 a drop idea thinking take detour little 메커니즘 immediate how and to proceed e 통해 높은 입력 부분않은 언급되지처리하여 단계 <nat> <nat> sql <hnr>즉, 어떻게 진행할 것인지에 대한 즉각적인 생각을 버리고 생각을 조금만 뒤로 돌립니다.XY 문제로 지치지 않도록 주의하세요.

정규 계약이 끝나기 전에 부정적인 전망을 내놨지만, 그 후에 댓글이 달린 부분이 있다면 주의하시기 바랍니다.src마찬가지로 무시될 것입니다.

(src=\")+(\S)+(\.js\")+(?!.*-->)(.*)

편집:

(PL/SQL에는 없는) 앞을 내다보지 않고도 비슷한 것을 관리했습니다.

(src=\")(\S)+(\.js\")[^(--)\n]+(\n|$)

여기에 제 해결책이 있습니다. 한가지 간단한 부정적인 시선이 뒤에 있습니다.

(?<!<!--.+)src=".+\.js"

모든 은 의 과 src 하지만 과 은 하지 하지 은 과 은 <!--수도 . 몇 인 사례를 ;) 그냥 충분할 수도 있어요, 혹시 제가 몇 가지 구체적인 사례를 놓쳤다면 말해주세요 ;)

다음은 확장 예제인 https://regex101.com/r/rmHkbm/1 에서 실행 중인 솔루션입니다.

편집 : 자바스크립트에서 작동합니다. ORACLE PL/SQL에 대해서는 모르겠습니다.Oracle 데이터베이스를 설치하지 않고 테스트할 수 있는 방법이 있습니까?

부정적인 시선 없이는 하나의 정규 표현으로 원하는 것을 할 수 없다고 생각합니다.그러나 SQL에서 쉽게 할 수 있는 방식으로 두 개의 유사한 정규식을 논리적으로 결합하여 수행할 수 있습니다.기본 아이디어는 다음과 같습니다.

[MATCH_EXPR] AND NOT [COMMENTED_MATCH_EXPR]

테이블이 있다고 가정해 보겠습니다.datalinecode), (lines of code), (lines of code), (lines of code), (lines of lines (lines of lines), (lines of lines of lines)와 같은 방법으로

SELECT line
FROM data
WHERE REGEXP_LIKE(line, 'src="[^"]+.js"') AND NOT REGEX_LIKE(line, '<!--.*src="[^"]+.js"');

정규식을 더 정확하게 업데이트하거나 파일 이름 캡처와 같은 더 정교한 작업을 수행할 수 있지만 접근 방식은 동일합니다.

두 개의 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔΔ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ<script>두 번째 정규식이 일치하기 때문에 두 번째 것만 주석이 달린 문장.그럼에도 불구하고, 그것은 위의 예시들을 포함한 대부분의 일반적인 코드에 효과가 있을 것입니다.

저는 https://livesql.oracle.com 에서 아래와 같은 것을 시도해 보았으므로 아마도 당신에게 도움이 될 것입니다. 언급되지 않은 줄이 다음과 같이 시작한다고 가정합니다.'<script' 이 요 요 등의 선과 일치합니다.

    <script type="text/javascript" src="jquery.cookie.js"></script>
    <script type="text/javascript" src="jquery.serialize-object.js"/>
    <script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment -- afterwards -->

정규식을 사용한 쿼리:

select "SRC" from "TABLE_1" 
where REGEXP_LIKE (SRC, '^\<script.+\.js.+script\>$') 
   or REGEXP_LIKE (SRC, '^\<script.+\.js.+script\>\<\!\-\-.+\-\-\>$') 
   or REGEXP_LIKE (SRC, '^\<script.+\.js.+\/\>$');

언급URL : https://stackoverflow.com/questions/49274050/regular-expression-to-select-a-particular-content-provided-it-is-not-enclosed-i

반응형