【问题标题】:Regex find then replace for all instances正则表达式查找然后替换所有实例
【发布时间】:2012-07-02 15:59:30
【问题描述】:

我有一个用 Javascript 文件的脚本标签填充的字符串,我想用 .min.js 替换所有 .js 实例。我不能假设字符串的内容将采用如下所示的相同格式。所以我需要将替换限制在 src= 部分内。

我假设正则表达式最适合这个,但我将如何进行查找,然后替换所有实例?

<script type=\"text/javascript\" src=\"../../Scripts/json.js\"></script><script type=\"text/javascript\" src=\"../../Scripts/Logger.js\"></script>  <script type=\"text/javascript\" src=\"../../Scripts/PageHelper.js\"></script>

另一个考虑是我不想替换已经定义为 min.js 的 .min.js。

【问题讨论】:

  • 为什么不直接使用Visual Studio的Find and Replace
  • 最好是正确输出页面 - 根据需要使用“.min.js”或“.js”... - 不需要危险的 RegEx 操作。
  • 显然don't parse HTML with regex,因为如果您不能保证 HTML 的格式,它就不适合。
  • 我不认为仅使用正则表达式就可以解决这个问题,至少很难做到 100% 安全。为什么不编写搜索 src= 标签的简短函数(并计算引号 %2 以确保它不在某些 x="...src"... 中,然后使用包含循环遍历所有包含 ".js 的结果) ”,如果没有“.min”,则在.js之前的索引处替换?这可以在2分钟内编程。
  • 正如其他人所说,正则表达式不太适合这样的任务。你绝对需要使用它们(无法想象一个原因)还是你也会接受非正则表达式的解决方案?

标签: c# regex


【解决方案1】:

免责声明:我不推荐正则表达式进行 html 解析...
如果脚本标签引号没有被转义(它们不应该被转义),这应该可以工作

=======================

原始正则表达式查找

<script(?=\s)(?=((?:[^>"']|"[^"]*"|'[^']*')*?)(?<=\s)src\s*=(?:(?>\s*(['"])\s*((?:(?!\g{-2}).)+)(?<!\.min)\.js\s*\g{-2})|(?>(?!\s*['"])\s*([^\s>]*)(?<!\.min)\.js(?=\s|>)))((?>(?:".*?"|'.*?'|[^>]?)+)))(?>\s+(?:".*?"|'.*?'|[^>]*?)+>)(?<!/>)

原始替换

<script$1src="$3$4.min.js"$5>

修饰符's',单行(表示全点)

扩展正则表达式

 <script 
   (?=\s) 
   (?= 
       ( (?: [^>"']|"[^"]*"|'[^']*')*? ) (?<=\s)          # (1) - before 'src'
       src \s*=
       (?:
           (?> \s* (['"])  \s* ((?:(?!\g{-2}).)+ ) (?<!\.min)\.js \s* \g{-2} )   # (2,3)
         | (?> (?!\s*['"]) \s* ([^\s>]*)           (?<!\.min)\.js (?=\s|>)   )   # (4)  - use $3.$4
       )
       ( (?> (?:".*?"|'.*?'|[^>]?)+ ) )                   # (5) - after 'src'
   )
   (?> \s+ (?:".*?"|'.*?'|[^>]*?)+ 
 >
   ) (?<! /> )

或者...

     <script
     (?= \s )
     (?=
1         (
               (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
1         )
          (?<= \s )
          src\s*=
          (?:
               (?>
                    \s*
2                   ( ['"] )
                    \s*
3                   (
                         (?:
                              (?! \g{-2} )
                              .
                         )+
3                   )
                    (?<! \.min )
                    \.js\s*\g{-2}
               )
            |  
               (?>
                    (?! \s* ['"] )
                    \s*
4                   ( [^\s>]* )
                    (?<! \.min )
                    \.js
                    (?= \s | > )
               )
          )
5         (
               (?>
                    (?: ".*?" | '.*?' | [^>]? )+
               )
5         )
     )
     (?>
          \s+
          (?: ".*?" | '.*?' | [^>]*? )+
          >
     )
     (?<! /> )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    相关资源
    最近更新 更多