Java 正则的一个问题

2019-10-27 16:01:38 +08:00
 xjn17858906105

String str = "3\r123u99"; String reg = ".\r.";

Matcher m1 = Pattern.compile(reg).matcher(str); while (m1.find()) { System.out.println(m1.group()); }

刚接触正则,这段正则的匹配结果让我不解啊

3409 次点击
所在节点    Java
10 条回复
dallaslu
2019-10-27 16:11:53 +08:00
那么匹配结果是什么,以及你觉得应该是什么呢?
xjn17858906105
2019-10-27 16:27:18 +08:00
@dallaslu 我觉得应该是
************
3

1
************
可是输出的结果是
************
1
************
chengyiqun
2019-10-27 16:50:57 +08:00
你是在 windows 平台测试的吗?
xjn17858906105
2019-10-27 16:51:51 +08:00
@chengyiqun 我是在 mac 上测试的,用 idea,在控制台上打印
xjn17858906105
2019-10-27 16:53:08 +08:00
刚刚 stackoverflow 上的老兄是这么回答的 https://stackoverflow.com/a/58577737/8432118
QiuSe
2019-10-27 17:26:50 +08:00
@xjn17858906105 这个解释不是很好吗?
如果你想输出你要的结果,String str = "3\n123u99"; String reg = ".\n.";就是你要的。
想知道为什么\r 不行, 你只需要在 main 方法里写 System.out.println("ww3\r123u99"),不写其他的代码,这个是控制台的规定吧。
ipwx
2019-10-27 18:11:50 +08:00
因为控制台里面 \r 等于回到行首重新开始输出啊。不信你 replace \r 为 \\r
szq8014
2019-10-27 19:22:19 +08:00
你遇到了著名的文件换行符问题。
\r\n 分别是把光标挪到行首与换行。
只写\r 就只是把兴标挪到了行首,输出的字符会覆盖原来的,用这个特性可以做控制台的基于字符的下载进度条。
按照标准来的话,只写 \n 效果应该是
12345
_____67890
这样的,不过不会这样的
m1ch3ng
2019-10-27 22:56:17 +08:00
匹配的是 3\r1,然后因为是 syso 输出,遇到\r 会光标移到行首,所以输出 1 ?
xjn17858906105
2019-10-28 09:18:03 +08:00
@m1ch3ng 是的,我试验过了,也确实如此

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/613412

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX