簡體   English   中英

你有沒有看到 Golang Regexp 沒有找到所有出現的情況?

[英]have you seen Golang Regexp not find all occurrences?

我有一個示例,我試圖刪除文件的所有行,其中它是空的(僅換行符或空格和換行符)。 我以為我可以使用簡單的^\\s*$輕松完成此操作。 當我使用grep -e '^\\s*$' samplefile | wc -l時,我擁有的文件樣本有 724 行,出現了 182 次這種模式grep -e '^\\s*$' samplefile | wc -l grep -e '^\\s*$' samplefile | wc -l和我可以簡單地添加-v標志並重定向輸出以獲取刪除多余行的內容。

在 Go 1.12.4 中,我嘗試:

dat, _ := ioutil.ReadFile("./samplefile")
ioutil.WriteFile("eventbody", []byte(strings.Split(string(dat), "</head>")[1]), 0555)

regNewline := regexp.MustCompile(`(?ms)^\s*$`)
d := regNewline.ReplaceAll(dat, []byte(""))
ioutil.WriteFile("./emptyremoved", d, 0555)

結果文件比實際做我想做的事少了 143 次。 示例文件只是一個 HTML 頁面。 我開始這樣做的全部原因是因為我無法獲得golang.org/x/net/html包來解析 HTML 並逐步遍歷令牌以獲取我想要的數據(表格行)並解決了一些重新試圖解決我的問題,但我仍然陷入了死胡同。

示例文件:

 <!DOCTYPE html> <html lang="en"> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>SourceManagementboard</title> <style> @font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 400; src: local('Open Sans'), local('OpenSans'), url(/static/fonts/Open_Sans.woff) format('woff'); } input[type=text] { width: 130px; border: 2px solid #f96302; -webkit-transition: width 0.4s ease-in-out; transition: width 0.4s ease-in-out; } input[type=text]:focus { width: 270px; } </style> <link href='//fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css' /> <link href="/static/Semantic-UI-2.1.8/semantic.min.css" rel="stylesheet" /> <link href='//cdnjs.cloudflare.com/ajax/libs/datatables/1.10.13/css/dataTables.semanticui.min.css' rel='stylesheet' type='text/css'> <link href="/static/css/c3.min.css" rel="stylesheet" /> <link href="/static/css/SourceManagementboard.css" rel="stylesheet" /> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/datatables/1.10.13/js/jquery.dataTables.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/datatables/1.10.13/js/dataTables.semanticui.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.7.0/moment.min.js"></script> <script src="/static/js/timestamps.js"></script> <script src="/static/Semantic-UI-2.1.8/semantic.min.js"></script> <script src="/static/js/lists.js"></script> <script src="/static/js/scroll.top.js"></script> <script src="/static/js/d3.min.js"></script> <script src="/static/js/c3.min.js"></script> <script src="/static/jquery-tablesort-v.0.0.11/jquery.tablesort.min.js"></script> <script src="/static/js/Chart.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ $(".ui.dropdown").dropdown(); $.getScript('/static/js/lists.js') $.getScript('/static/js/tables.js') }) </script> <script type="text/javascript"> function jumpToServerPage() { var myserver = document.getElementById("serverJump").value; if (myserver == "*.foo.com"){ var jumpto = "/node/" + myserver; window.location = jumpto; else { var jumpto = "/node/" + myserver + ".foo.com"; window.location = jumpto; } } </script> <!-- begin usabilla live embed code --> <script type="text/javascript">/*{literal}<![CDATA[*/window.lightningjs||function(c){function g(b,d){d&&(d+=(/\\?/.test(d)?"&":"?")+"lv=1");c[b]||function(){var i=window,h=document,j=b,g=h.location.protocol,l="load",k=0;(function(){function b(){aP(l);aw=1;c[j]("_load")}c[j]=function(){function m(){m.id=e;return c[j].apply(m,arguments)}var b,e=++k;b=this&&this!=i?this.id||0:0;(as=as||[]).push([e,b,arguments]);m.then=function(b,c,h){var d=a.fh[e]=a.fh[e]||[],j=a.eh[e]=a.eh[e]||[],f=a.ph[e]=a.ph[e]||[];b&&d.push(b);c&&j.push(c);h&&f.push(h);return m};return m};var a=c[j]._={};a.fh={};a.eh={};a.ph={};al=d?d.replace(/^\\/\\//,(g=="https:"?g:"http:")+"//"):d;ap={0:+new Date};aP=function(b){ap[b]=new Date-ap[0]};aw&&b();i.addEventListener?i.addEventListener(l,b,!1):i.attachEvent("on"+l,b);var q=function(){function b(){return["<head></head><",c,' onload="var d=',n,";d.getElementsByTagName('head')[0].",d,"(d.",g,"('script')).",i,"='",al,"'\\"></",c,">"].join("")}var c="body",e=h[c];if(!e)return setTimeout(q,100);aP(1);var d="appendChild",g="createElement",i="src",k=h[g]("div"),l=k[d](h[g]("div")),f=h[g]("iframe"),n="document",p;k.style.display="none";e.insertBefore(k,e.firstChild).id=o+"-"+j;f.frameBorder="0";f.id=o+"-frame-"+j;/MSIE[ ]+6/.test(navigator.userAgent)&&(f[i]="javascript:false");f.allowTransparency="true";l[d](f);try{f.contentWindow[n].open()}catch(s){a.domain=h.domain,p="javascript:var d="+n+".open();d.domain='"+h.domain+"';",f[i]=p+"void(0);"}try{var r=f.contentWindow[n];r.write(b());r.close()}catch(t){f[i]=p+'d.write("'+b().replace(/"/g,String.fromCharCode(92)+'"')+'");d.close();'}aP(2)};al&&setTimeout(q,0)})()}();c[b].lv="1";return c[b]}var o="lightningjs",k=window[o]=g(o);k.require=g;k.modules=c}({}); window.usabilla_live = lightningjs.require("usabilla_live", "//w.usabilla.com/521b4f1b8dd9.js"); /*]]>{/literal}*/</script> <!-- end usabilla live embed code --> </head> <body> <div class="ui doubling stackable inverted large menu" style="margin-top: 0px; margin-bottom: 20px;"> <div class="title item" style="margin-top: 0px; margin-bottom: 0px;"> <a href="/"> <img src="/static/icons/fldlogo.svg"> </a> </div> <a class="item" href="/">Report Board</a> <a class="item" href="/search">StackRepo</a> <a class="item" href="/validate">Validate Info</a> <a class="item" href="/patching">Patching Status</a> <div class="ui item dropdown">More<i class="dropdown icon"></i> <div class="menu"> <a class="item" href="/nodes">Nodes</a> <a class="item" href="/"></a> <a class="item" href="/reports">Reports</a> <a class="item" href="/metrics">Metrics</a> <a class="item" href="/inventory">Inventory</a> <a class="item" href="/catalogerrors">Catalog Errors</a> <a class="item" href="/radiator">Radiator</a> <a class="item" href="/query">Query</a> <a class="item" href="/module">Module Reporting</a> <a class="item" href="/grid_versions">Grid Versions</a> <a class="item" href="/summary">Core State</a> </div> </div> <form method="POST" class="item" action="/serverjump" name="serverjump"> <input class="item" type="submit" value="Go" style="background-color: #f96302; color: black;"> <input class="item" style="color: orange;" id="server_name" name="server_name" type="text" placeholder="Jump to a Server info page" value=""> </form> <div class="item right"> <div class="ui item dropdown"> <b>S</b> <i class="dropdown icon"></i> <div class="menu"> <a class="item " href="/%2A/report/myserv.foo.com/58964efb70ab87610ff4ce3fdbf46ce7dea54dac">All servers</a> <a class="item " href="/production/report/myserv.foo.com/58964efb70ab87610ff4ce3fdbf46ce7dea54dac">Datacenter</a> <a class="item active" href="/report/myserv.foo.com/58964efb70ab87610ff4ce3fdbf46ce7dea54dac">S</a> </div> </div> </div> </div> <div class="ui grid padding-bottom"> <div class="one wide column"></div> <div class="fourteen wide column"> <h1>Summary</h1> <table class='ui basic table'> <thead> <tr> <th>Certname</th> <th>Configuration version</th> <th>Start time</th> <th>End time</th> </tr> </thead> <tbody> <tr> <td><a href="/node/myserv.foo.com">myserv.foo.com</a></td> <td> <p>1581366405</p> </td> <td rel="utctimestamp"> 2020-02-10 20:26:02.286000+00:00 </td> <td rel="utctimestamp"> 2020-02-10 20:27:33.971000+00:00 </td> </tr> </tbody> </table> <style> .button { display: inline-block; border-radius: 4px; background-color: #f4511e; border: none; color: #FFFFFF; transition: all 0.5s; cursor: pointer; } .button span { cursor: pointer; display: inline-block; position: relative; transition: 0.5s; } .button span:after { content: '»'; position: absolute; opacity: 0; top: 0; right: -20px; transition: 0.5s; } .button:hover span { padding-right: 25px; } .button:hover span:after { opacity: 1; right: 0; } </style> <h1>Events <a href="/download_report/myserv.foo.com/58964efb70ab87610ff4ce3fdbf46ce7dea54dac/events"><button style="float: right;" class="ui grey button"><span>Download</span></button></a></h1> <table class='ui basic compact fixed wrapped table'> <thead> <tr> <th class="eight wide">Resource</th> <th class="two wide">Status</th> <th class="two wide">Changed From</th> <th class="four wide">Changed To</th> </tr> </thead> <tbody> <tr id='event-1' class='ui line changed'> <td>Exec[/bin/ksh -c &#39;source /usr/local/bin/src.host; /opt/sr/su/bin/sr-db-sc 1249 N COM&#39;]</td> <td>success</td> <td>notrun</td> <td>[u&#39;0&#39;]</td> </tr> <tr id='event-2' class='ui line failed'> <td>Package[sr-kd-if]</td> <td>failure</td> <td>1.22-1</td> <td>2.0-2</td> </tr> <tr id='event-3' class='ui line changed'> <td>Exec[yum_trex reconfig]</td> <td>success</td> <td>notrun</td> <td>[u&#39;0&#39;]</td> </tr> <tr id='event-4' class='ui line changed'> <td>Exec[yum_trex config]</td> <td>success</td> <td>notrun</td> <td>[u&#39;0&#39;]</td> </tr> <tr id='event-5' class='ui line changed'> <td>Exec[rpm_import_stflag]</td> <td>success</td> <td>notrun</td> <td>[u&#39;0&#39;]</td> </tr> <tr id='event-6' class='ui line changed'> <td>Exec[RK sed on agent_flag]</td> <td>success</td> <td>notrun</td> <td>[u&#39;0&#39;]</td> </tr> </tbody> </table> <h1>Logs <a href="/download_report/myserv.foo.com/58964efb70ab87610ff4ce3fdbf46ce7dea54dac/logs"><button style="float: right;" class="ui grey button"><span>Download</span></button></a></h1> <table class='ui basic compact fixed wrapped table'> <thead> <tr> <th>Timestamp</th> <th>Source</th> <th>Tags</th> <th>Message</th> <th>Location</th> <tr> </thead> <tbody> <tr class='warning'> <td rel="utctimestamp">2020-02-10T15:26:07.109-05:00</td> <td>SourceManagement</td> <td>warning</td> <td>Unable to fetch my node definition, but the agent run will continue:</td> <td></td> </tr> <tr class='warning'> <td rel="utctimestamp">2020-02-10T15:26:07.109-05:00</td> <td>SourceManagement</td> <td>warning</td> <td>Could not intern from application/json: Could not find a directory environment named &#39;env&#39; anywhere in the path: /etc/SourceManagement/code/environments. Does the directory exist?</td> <td></td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:26:07.110-05:00</td> <td>SourceManagement</td> <td>info</td> <td>Retrieving plugin</td> <td></td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:26:07.326-05:00</td> <td>SourceManagement</td> <td>info</td> <td>Retrieving plugin</td> <td></td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:26:08.349-05:00</td> <td>SourceManagement</td> <td>info</td> <td>Retrieving locales</td> <td></td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:26:08.572-05:00</td> <td>SourceManagement</td> <td>info</td> <td>Loading </td> <td></td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:19.334-05:00</td> <td>SourceManagement</td> <td>info</td> <td>Caching catalog for myserv.foo.com</td> <td></td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:20.824-05:00</td> <td>SourceManagement</td> <td>info</td> <td>Applying configuration version &#39;1581366405&#39;</td> <td></td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:26.979-05:00</td> <td>/Stage[main]/RK::V1_0_1/Exec[RK sed on agent_flags.conf]/returns</td> <td>notice, exec, class, rk::v1_0_1, rk, v1_0_1</td> <td>executed successfully</td> <td>/etc/SourceManagement/code/environments/env/modules/rk/manifests/v1_0_1.pp:25</td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:26.980-05:00</td> <td>/Stage[main]/RK::V1_0_1/Exec[RK sed on agent_flags.conf]</td> <td>info, exec, class, rk::v1_0_1, rk, v1_0_1</td> <td>Scheduling refresh of Service[rkagents]</td> <td>/etc/SourceManagement/code/environments/env/modules/rk/manifests/v1_0_1.pp:25</td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:27.492-05:00</td> <td>/Stage[main]/RK::V1_0_1/Service[rkagents]</td> <td>notice, service, rkagents, class, rk::v1_0_1, rk, v1_0_1</td> <td>Triggered &#39;refresh&#39; from 1 event</td> <td>/etc/SourceManagement/code/environments/env/modules/rk/manifests/v1_0_1.pp:33</td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:29.030-05:00</td> <td>/Stage[main]/tr::V1_0_5::Config/Exec[rpm_import_tr]/returns</td> <td>notice, exec, rpm_import_tr, class, tr::v1_0_5::config, tr, v1_0_5, config, tr::v1_0_5</td> <td>executed successfully</td> <td>/etc/SourceManagement/code/environments/env/modules/tanium/manifests/v1_0_5/config.pp:40</td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:35.083-05:00</td> <td>/Stage[main]/Toolrental_trex_svc/Exec[yum_trex config]/returns</td> <td>notice, exec, class, toolrental_trex_svc</td> <td>executed successfully</td> <td>/etc/SourceManagement/code/environments/env/modules/toolrental_trex_svc/manifests/init.pp:7</td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:35.101-05:00</td> <td>/Stage[main]/Toolrental_trex_svc/Exec[yum_trex reconfig]/returns</td> <td>notice, exec, class, toolrental_trex_svc</td> <td>executed successfully</td> <td>/etc/SourceManagement/code/environments/env/modules/toolrental_trex_svc/manifests/init.pp:17</td> </tr> <tr class='error'> <td rel="utctimestamp">2020-02-10T15:27:40.113-05:00</td> <td>SourceManagement</td> <td>err</td> <td>Could not update: Execution of &#39;/usr/bin/yum -d 0 -e 0 -y update sr-kd-if-2.0-2&#39; returned 1: Error Downloading Packages: jq-1.3-2.el6.x86_64: failed to retrieve getPackage/jq-1.3-2.el6.x86_64.rpm from rhel-x86_64-server-6-s-epel error was [Errno 14] PYCURL ERROR 22 - &#34;The requested URL returned error: 500 Internal Server Error&#34; sr-kd-if-2.0-2.x86_64: failed to retrieve getPackage/sr-kd-if-2.0-2.x86_64.rpm from rhel-x86_64-server-6-s-deploy error was [Errno 14] PYCURL ERROR 22 - &#34;The requested URL returned error: 500 Internal Server Error&#34;</td> <td></td> </tr> <tr class='error'> <td rel="utctimestamp">2020-02-10T15:27:40.117-05:00</td> <td>/Stage[main]/sr-kd-if::V2_0/Package[sr-kd-if]/ensure</td> <td>err, package, sr-kd-if, class, sr-kd-if::v2_0, sr-kd-if, v2_0</td> <td>change from &#39;1.22-1&#39; to &#39;2.0-2&#39; failed: Could not update: Execution of &#39;/usr/bin/yum -d 0 -e 0 -y update sr-kd-if-2.0-2&#39; returned 1: Error Downloading Packages: jq-1.3-2.el6.x86_64: failed to retrieve getPackage/jq-1.3-2.el6.x86_64.rpm from rhel-x86_64-server-6-s-epel error was [Errno 14] PYCURL ERROR 22 - &#34;The requested URL returned error: 500 Internal Server Error&#34; sr-kd-if-2.0-2.x86_64: failed to retrieve getPackage/sr-kd-if-2.0-2.x86_64.rpm from rhel-x86_64-server-6-s-deploy error was [Errno 14] PYCURL ERROR 22 - &#34;The requested URL returned error: 500 Internal Server Error&#34;</td> <td>/etc/SourceManagement/code/environments/env/modules/sr-kd-if/manifests/v2_0.pp:2</td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:55.695-05:00</td> <td>/Stage[main]/Com::Ismt/fld::Ismt[1249 COM]/Exec[/bin/ksh -c &#39;source /usr/local/bin/src.host; /opt/hd/su/bin/sr-db-sc 1249 N COM&#39;]/returns</td> <td>notice, exec, fld::ismt, fld, ismt, class, com::ismt, com, fld::catalog, catalog, com::pr::v19_11_2, pr, v19_11_2</td> <td>executed successfully</td> <td>/etc/SourceManagement/code/environments/env/modules/fld/manifests/ismt.pp:7</td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:55.696-05:00</td> <td>/Stage[main]/Com::Ismt/fld::Ismt[1249 COM]/Exec[/bin/ksh -c &#39;source /usr/local/bin/src.host; /opt/hd/su/bin/sr-db-sc 1249 N COM&#39;]</td> <td>info, exec, fld::ismt, fld, ismt, class, com::ismt, com, fld::catalog, catalog, com::pr::v19_11_2, pr, v19_11_2</td> <td>Scheduling refresh of Exec[/bin/chown pris01:dbaccgrp /opt/hd/su/tmp/*]</td> <td>/etc/SourceManagement/code/environments/env/modules/fld/manifests/ismt.pp:7</td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:55.905-05:00</td> <td>/Stage[main]/Ismt_2615_pp::V1_0_0/fld::Ismt[ismt_2615]/Exec[/bin/chown pris01:dbaccgrp /opt/hd/su/tmp/*]</td> <td>notice, exec, fld::ismt, fld, ismt, ismt_2615, class, ismt_2615_pp::v1_0_0, ismt_2615_pp, v1_0_0</td> <td>Triggered &#39;refresh&#39; from 1 event</td> <td>/etc/SourceManagement/code/environments/env/modules/fld/manifests/ismt.pp:22</td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:56.069-05:00</td> <td>Stage[main]</td> <td>info, stage</td> <td>Unscheduling all events on Stage[main]</td> <td></td> </tr> <tr class='positive'> <td rel="utctimestamp">2020-02-10T15:27:56.404-05:00</td> <td>SourceManagement</td> <td>notice</td> <td>Applied catalog in 35.89 seconds</td> <td></td> </tr> </tbody> </table> <h1>Metrics <a href="/download_report/myserv.foo.com/58964efb70ab87610ff4ce3fdbf46ce7dea54dac/metrics"><button style="float: right;" class="ui grey button"><span>Download</span></button></a></h1> <table class="ui basic table compact"> <thead> <tr> <th>Category</th> <th>Name</th> <th>Value</th> </tr> </thead> <tbody> <tr> <td>resources</td> <td>changed</td> <td>5.0</td> </tr> <tr> <td>resources</td> <td>corrective_change</td> <td>5.0</td> </tr> <tr> <td>resources</td> <td>failed</td> <td>1.0</td> </tr> <tr> <td>resources</td> <td>failed_to_restart</td> <td>0.0</td> </tr> <tr> <td>resources</td> <td>out_of_sync</td> <td>6.0</td> </tr> <tr> <td>resources</td> <td>restarted</td> <td>2.0</td> </tr> <tr> <td>resources</td> <td>scheduled</td> <td>0.0</td> </tr> <tr> <td>resources</td> <td>skipped</td> <td>0.0</td> </tr> <tr> <td>resources</td> <td>total</td> <td>754.0</td> </tr> <tr> <td>time</td> <td>config_retrieval</td> <td>60.69</td> </tr> <tr> <td>time</td> <td>cron</td> <td>0.01</td> </tr> <tr> <td>time</td> <td>exec</td> <td>7.89</td> </tr> <tr> <td>time</td> <td>file</td> <td>6.95</td> </tr> <tr> <td>time</td> <td>file_line</td> <td>0.01</td> </tr> <tr> <td>time</td> <td>filebucket</td> <td>0.0</td> </tr> <tr> <td>time</td> <td>filesystem</td> <td>0.01</td> </tr> <tr> <td>time</td> <td>logical_volume</td> <td>2.35</td> </tr> <tr> <td>time</td> <td>mount</td> <td>0.0</td> </tr> <tr> <td>time</td> <td>package</td> <td>13.01</td> </tr> <tr> <td>time</td> <td>pe_anchor</td> <td>0.0</td> </tr> <tr> <td>time</td> <td>service</td> <td>0.76</td> </tr> <tr> <td>time</td> <td>total</td> <td>91.69</td> </tr> <tr> <td>time</td> <td>user</td> <td>0.0</td> </tr> <tr> <td>changes</td> <td>total</td> <td>5.0</td> </tr> <tr> <td>events</td> <td>failure</td> <td>1.0</td> </tr> <tr> <td>events</td> <td>success</td> <td>5.0</td> </tr> <tr> <td>events</td> <td>total</td> <td>6.0</td> </tr> </tbody> </table> </div> <div class="one wide column"></div> </div> <div id="scroll-btn-top"> <i class="large arrow up icon"></i> </div> </body> </html>

編輯:

grep -v -e '^\\s*$' samplefile之后的最后 25 行文件

 <tr> <td>changes</td> <td>total</td> <td>5.0</td> </tr> <tr> <td>events</td> <td>failure</td> <td>1.0</td> </tr> <tr> <td>events</td> <td>success</td> <td>5.0</td> </tr> <tr> <td>events</td> <td>total</td> <td>6.0</td> </tr> </tbody> </table> </div> <div class="one wide column"></div> </div> <div id="scroll-btn-top"> <i class="large arrow up icon"></i> </div> </body> </html>

Go 代碼示例后的最后 25 行文件:

 <tr> <td>events</td> <td>success</td> <td>5.0</td> </tr> <tr> <td>events</td> <td>total</td> <td>6.0</td> </tr> </tbody> </table> </div> <div class="one wide column"></div> </div> <div id="scroll-btn-top"> <i class="large arrow up icon"></i> </div> </body> </html>

^$是在行首或行尾匹配但不包括相鄰換行符的錨點 所以你的正則表達式所做的就是刪除純空白行上的空白(並將相鄰的純空白行合並為一個;見下文),但它不會刪除初始或最終的換行符。

您需要刪除多行模式並使用(^|\\n)(\\n|$)來匹配實際的換行符,這將允許您替換它們。 請注意,您只想替換其中之一; 否則,圍繞空白行的行將被加入。 另請注意,根據您選擇替換哪一個,您可能會得到一個額外的初始或最終換行符,因此您可能希望單獨處理初始和最終的一組純空白行(可能存在也可能不存在)。


(舊答案在下面;也許對其他人有用。)

\\s也匹配換行符, *查找最大長度匹配。 因此,相鄰的純空白行將成為一個匹配。~~~

如果您需要計算單個行,請嘗試使用*? 相反,它會產生一個非貪婪的匹配(所以它會在到達$停止)。 或者使用[^\\n\\S]而不是\\s ,它表示“匹配除換行符或非空格之外的任何內容”。

我想我已經弄清楚了。 比賽的問題似乎與開始和結束錨點的使用有關。 ^$一起使用時,使用(?ms)將匹配行為從每個字符串更改為每行加上每個字符串會引發引擎。 簡單地使用(?ms)\\s+$只匹配可能是\\t \\n \\r \\f \\v 這產生了我正在尋找的行為(僅匹配空白行)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM