Java正则表达式分割字符串

7
我将尝试在Java中编写一个模式,通过破折号和制表符来分割以下字符串。但是,如果在字符串中遇到制表符后出现了破折号(即使只出现一次),我们将停止使用破折号进行分割,并仅使用制表符进行分割。例如:
输入字符串(那些大空格是制表符):
"4852174--r-watch   7   47  2   0   80-B    20  5"

期望输出:["4852174", "r", "watch", "7", "47", "2", "0", "80-B", "20", "5"] 到目前为止,我使用以下正则表达式:"(?<!\\d)(\\-+)(?!\t)|\t" 第一组括号表示我不希望在分隔符之前有任何数字,下一个用于表示我希望有一个或多个连字符,并且最后一组括号表示我不希望在分隔符之后出现制表符。当然,在末尾的OR用于通过单个制表符进行拆分。
得到的结果如下所示:["4852174-", "r", "watch", "7", "47", "2", "0", "80-B", "20", "5"] 请注意“4852174-”中多余的连字符,这是不应该存在的。 我已经尝试了很长时间来解决这个问题,但是我做出的任何小修改都会破坏其他地方的拆分。
非常感谢您提供解决此问题的任何帮助。 先谢谢!

只是澄清一下,我的正则表达式知识不是很好,但这可能对某些人有用。先生,您想从一个或多个破折号中分割它吗?如果是这样,为什么您期望 80-B 作为输出呢? - bhathiya-perera
1
剩余的破折号前面有一个数字,因此它不会被匹配(您的正则表达式中的 (?<!\d) 部分)。我觉得您可能缺少一些必要的规则。您能回答一下:为什么 80-B 不应该被拆分? - sp00m
1
@Manbearpig:80-B中破折号后面没有制表符,为什么不能分割? - anubhava
1
检查(?:[^\s-]|(?<=\d)-(?=[^\W\d]))+。我考虑匹配而不是分割。我认为你的规则没有明确定义,所以我只是让它针对你提供的输入“工作”。 - HamZa
1
楼主在这里。大家都注意到了,我的规则是不正确的。我已经更新了它们,以便如果将来有人遇到这个问题并正在寻找解决方案,他们可以使用。我一直在尝试使用.split(),但对于迄今为止提出的任何解决方案都无效,但是使用@HamZa的带有模式/匹配器的正则表达式,它有效!谢谢。 - HikeTakerByRequest
显示剩余2条评论
2个回答

7
正则表达式
\t|-+(?!\w\t)

将字符串分割为所需的数组,但如果没有进一步的说明,我无法告诉您它是否适用于其他字符串。

您可以在www.regexpal.com上测试正则表达式(这是使用您的正则表达式)。

请注意,在Java中必须转义反斜杠。因此,在Java中,它将是

\\t|-+(?!\\w\\t)

它也不会分割 A-B\t,我不确定 OP 的意思。 - anubhava
这个方法很好用,使用.split()!非常感谢。 - HikeTakerByRequest

1

匹配您的字符串的正则表达式是:^(([^-\s]+?)[-\s]*)+$

上述正则表达式将匹配您的字符串,即使连字符(-)重复超过两次也可以匹配。您可以通过从第2组(\2)获取匹配项来获得预期输出。

第1组匹配:(([^-\s]+?)[-\s]*)

第2组匹配:([^-\s]+?) => 这是您构建输出所需的分组。


谢谢回复!我尝试了使用模式/匹配器的^(([^-\s]+?)[-\s]*)+$,但对于破折号没有起作用,也不能用.split()方法。 - HikeTakerByRequest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接