[英]Java - Regex to Split Tokens With Minimum Size and Delimiters
我知道我知道,有很多类似的问题,我可以说我读了所有这些问题。 但是,我对正则表达式并不擅长,我无法弄清楚我需要的正则表达式。
我想在Java中拆分一个String,我有4个约束:
例如,输入:
"Hello World! This answer worth $1.45 in US dollar. Thank you."
输出将是:
[Hello World!, This answer worth $1.45 in US dollar., Thank you.]
到目前为止,我得到了这个正则表达式的三个第一个约束的答案:
text.split("(?<=[.!?])(?<!\\d)(?!\\d)");
而且我知道我应该在我的正则表达式中使用{5,}
,但我试过的任何组合都不起作用。
对于以下情况: "I love US How about you?"
如果它给我一个或两个句子并不重要,只要它不将S.
标记为单独的句子。
最后,介绍一个很好的正则表达式教程是值得赞赏的。
更新:正如克里斯在评论中提到的那样,几乎不可能用正则表达式来解决这样的问题(用自然语言覆盖所有情况)。 然而,我发现HamZa的答案是壁橱,也是最有用的。
所以,小心! 接受的答案不会涵盖所有可能的用例!
下一个正则表达式怎么样?
(?<=[.!?])(?!\w{1,5})(?<!\d)(?!\d)
例如
private static final Pattern REGEX_PATTERN =
Pattern.compile("(?<=[.!?])(?!\\w{1,5})(?<!\\d)(?!\\d)");
public static void main(String[] args) {
String input = "Hello World! This answer worth $1.45 in U.S. dollar. Thank you.";
System.out.println(java.util.Arrays.toString(
REGEX_PATTERN.split(input)
)); // prints "[Hello World!, This answer worth $1.45 in U.S., dollar., Thank you.]"
}
根据之前制作的正则表达式得出答案。
正则表达式基本上是(?<=[.?!])\\s+(?=[az])
,这意味着匹配任何前面的空格一次或多次.
, ?
或者!
然后是[az]
(不要忘记i
修饰符)。
现在让我们根据这个问题的需要对其进行修改:
(?<=[.?!])\\\\s+(?=[az])
i
修饰符以匹配不区分大小写(?i)(?<=[.?!])\\\\s+(?=[az])
(?=(?i)(?<=[.?!])\\\\s+(?=[az]))
LETTER DOT LETTER DOT
格式中是否没有缩写:( (?i)(?<=[.?!])(?<![az]\\.[az]\\.)\\\\s+(?=[az])
所以我们的最终正则表达式如下:( (?i)(?<=[.?!])(?<![az]\\.[az]\\.)\\\\s+(?=[az])
。
一些链接:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.