我有一个示例,我试图删除文件中空的所有行(仅换行符或空格和换行符)。我以为我可以用一个简单的^\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
. 这会产生我正在寻找的行为(仅匹配空白行)。
呼啦一阵风
TA贡献1802条经验 获得超6个赞
^
并且$
是在行首或行尾匹配但不包括相邻换行符的锚点。因此,您的正则表达式所做的只是删除仅空白行上的空白(并将相邻的仅空白行合并为一个;见下文),但它不会删除初始或最终换行符。
您需要删除多行模式并使用(^|\n)
和(\n|$)
匹配实际的换行符,这将允许您替换它们。请注意,您只想替换其中一个;否则,围绕纯空白行的行将被加入。另请注意,根据您选择替换哪一个,您可能会得到一个额外的初始或最终换行符,因此您可能希望分别处理初始和最终的纯空白行(可能存在也可能不存在)。
(旧答案如下;也许对其他人有用。)
\s
还匹配换行符,并*
找到最大长度匹配。因此,相邻的只有空格的行将成为一个匹配。~~~
如果您需要计算单个行,请尝试使用*?
,它会产生非贪婪匹配(因此一旦到达 ,它将停止$
)。或者使用[^\n\S]
而不是\s
,它表示“匹配除换行符或非空格之外的任何内容”。
- 2 回答
- 0 关注
- 109 浏览
添加回答
举报
0/150
提交
取消