为了账号安全,请及时绑定邮箱和手机立即绑定

你见过 Golang Regexp 没有找到所有的匹配项吗?

你见过 Golang Regexp 没有找到所有的匹配项吗?

Go
哆啦的时光机 2022-05-18 10:06:35
我有一个示例,我试图删除文件中空的所有行(仅换行符或空格和换行符)。我以为我可以用一个简单的^\s*$. 我拥有的文件样本有 724 行长,在我使用时出现了 182 次这种模式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 并逐步通过令牌来获取我想要的数据(表行)并决定重新尝试解决我的问题,但我m 仍然陷入死胡同。
查看完整描述

2 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

我想我已经弄清楚了。看来比赛的问题与使用开始和结束锚点有关。使用 将(?ms)匹配行为从每个字符串更改为每行加上每个字符串^会在和$一起使用时抛出引擎。简单地使用(?ms)\s+$仅匹配可能是\t \n \r \f \v. 这会产生我正在寻找的行为(仅匹配空白行)。



查看完整回答
反对 回复 2022-05-18
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

^并且$是在行首或行尾匹配但不包括相邻换行符的锚点。因此,您的正则表达式所做的只是删除仅空白行上的空白(并将相邻的仅空白行合并为一个;见下文),但它不会删除初始或最终换行符。

您需要删除多行模式并使用(^|\n)(\n|$)匹配实际的换行符,这将允许您替换它们。请注意,您只想替换其中一个;否则,围绕纯空白行的行将被加入。另请注意,根据您选择替换哪一个,您可能会得到一个额外的初始或最终换行符,因此您可能希望分别处理初始和最终的纯空白行(可能存在也可能不存在)。


(旧答案如下;也许对其他人有用。)

\s还匹配换行符,并*找到最大长度匹配。因此,相邻的只有空格的行将成为一个匹配。~~~

如果您需要计算单个行,请尝试使用*?,它会产生非贪婪匹配(因此一旦到达 ,它将停止$)。或者使用[^\n\S]而不是\s,它表示“匹配除换行符或非空格之外的任何内容”。


查看完整回答
反对 回复 2022-05-18
  • 2 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信