仅限Java 7 Unicode正则表达式制表符和空格

仅限Java 7 Unicode正则表达式制表符和空格,java,regex,Java,Regex,我目前正在尝试为我们的应用程序添加对日语和法语编码的支持。在这样做的过程中,我试图创建两个模式匹配器来检测读取文件中的制表符和空格,而不考虑语言编码 这些将用于确定文件中使用的分隔符,以便相应地进行处理 当我尝试编译一个空间模式时 Pattern.compile(" ", Pattern.UNICODE_CHARACTER_CLASS); 我没有看到它生成一个正则表达式来处理不同的unicode空间值 例如类似于“[\\u00A0\\u2028\\u2029\\u3000\\u00C2\\u0

我目前正在尝试为我们的应用程序添加对日语和法语编码的支持。在这样做的过程中,我试图创建两个模式匹配器来检测读取文件中的制表符和空格,而不考虑语言编码

这些将用于确定文件中使用的分隔符,以便相应地进行处理

当我尝试编译一个空间模式时

Pattern.compile(" ", Pattern.UNICODE_CHARACTER_CLASS);
我没有看到它生成一个正则表达式来处理不同的unicode空间值

例如类似于
“[\\u00A0\\u2028\\u2029\\u3000\\u00C2\\u009A\\u0041]”

编译似乎可以正常使用“\s”字符集,但其中包括制表符和换行符

我应该如何在Java中实现这一点

更新

所以这不起作用的部分原因是日语网页文本没有空格,尽管看起来有空格。从web imoprt中获取以下行:

実なので説明は不要だろう。その後1987年

这里实际上没有空格う。そ. 只有三个字符


修复这一问题实际上是另一个问题的主题,因此我接受了Casimir的回答,因为它处理法语的情况很好。

您可以使用否定字符类。例如:

[^\\S \\t]
这意味着
\s
没有空格和制表符

或者可以使用类交叉点:

[\\s&&[^ \\t]]

可以使用否定字符类。例如:

[^\\S \\t]
这意味着
\s
没有空格和制表符

或者可以使用类交叉点:

[\\s&&[^ \\t]]

可以使用否定字符类。例如:

[^\\S \\t]
这意味着
\s
没有空格和制表符

或者可以使用类交叉点:

[\\s&&[^ \\t]]

可以使用否定字符类。例如:

[^\\S \\t]
这意味着
\s
没有空格和制表符

或者可以使用类交叉点:

[\\s&&[^ \\t]]

如果我听你的问题,你可以用这样的东西来表示空间-

Pattern p = Pattern.compile("^[ ]+$", Pattern.UNICODE_CHARACTER_CLASS);
String[] inputs = {" ", "  ", " \t", "Hello"};
for (String input : inputs) {
    Matcher m = p.matcher(input);
    System.out.printf("For input: '%s' = %s%n", input, m.find());
}
输出为

For input: ' ' = true
For input: '  ' = true
For input: '    ' = false
For input: 'Hello' = false
For input: '    ' = true
For input: '        ' = true
For input: '    ' = false
For input: 'Hello' = false
和标签

Pattern p = Pattern.compile("^[\t]+$", Pattern.UNICODE_CHARACTER_CLASS);
String[] inputs = {"\t", "\t\t", " \t", "Hello"};
for (String input : inputs) {
    Matcher m = p.matcher(input);
    System.out.printf("For input: '%s' = %s%n", input, m.find());
}
输出为

For input: ' ' = true
For input: '  ' = true
For input: '    ' = false
For input: 'Hello' = false
For input: '    ' = true
For input: '        ' = true
For input: '    ' = false
For input: 'Hello' = false

最后,使用
*
而不是
+
进行0或更多匹配。这将使用
+
,因此需要1个或多个匹配项。以(
^
)开始,以(
$
)结束。

如果我听你的问题,你可以用这样的空格-

Pattern p = Pattern.compile("^[ ]+$", Pattern.UNICODE_CHARACTER_CLASS);
String[] inputs = {" ", "  ", " \t", "Hello"};
for (String input : inputs) {
    Matcher m = p.matcher(input);
    System.out.printf("For input: '%s' = %s%n", input, m.find());
}
输出为

For input: ' ' = true
For input: '  ' = true
For input: '    ' = false
For input: 'Hello' = false
For input: '    ' = true
For input: '        ' = true
For input: '    ' = false
For input: 'Hello' = false
和标签

Pattern p = Pattern.compile("^[\t]+$", Pattern.UNICODE_CHARACTER_CLASS);
String[] inputs = {"\t", "\t\t", " \t", "Hello"};
for (String input : inputs) {
    Matcher m = p.matcher(input);
    System.out.printf("For input: '%s' = %s%n", input, m.find());
}
输出为

For input: ' ' = true
For input: '  ' = true
For input: '    ' = false
For input: 'Hello' = false
For input: '    ' = true
For input: '        ' = true
For input: '    ' = false
For input: 'Hello' = false

最后,使用
*
而不是
+
进行0或更多匹配。这将使用
+
,因此需要1个或多个匹配项。以(
^
)开始,以(
$
)结束。

如果我听你的问题,你可以用这样的空格-

Pattern p = Pattern.compile("^[ ]+$", Pattern.UNICODE_CHARACTER_CLASS);
String[] inputs = {" ", "  ", " \t", "Hello"};
for (String input : inputs) {
    Matcher m = p.matcher(input);
    System.out.printf("For input: '%s' = %s%n", input, m.find());
}
输出为

For input: ' ' = true
For input: '  ' = true
For input: '    ' = false
For input: 'Hello' = false
For input: '    ' = true
For input: '        ' = true
For input: '    ' = false
For input: 'Hello' = false
和标签

Pattern p = Pattern.compile("^[\t]+$", Pattern.UNICODE_CHARACTER_CLASS);
String[] inputs = {"\t", "\t\t", " \t", "Hello"};
for (String input : inputs) {
    Matcher m = p.matcher(input);
    System.out.printf("For input: '%s' = %s%n", input, m.find());
}
输出为

For input: ' ' = true
For input: '  ' = true
For input: '    ' = false
For input: 'Hello' = false
For input: '    ' = true
For input: '        ' = true
For input: '    ' = false
For input: 'Hello' = false

最后,使用
*
而不是
+
进行0或更多匹配。这将使用
+
,因此需要1个或多个匹配项。以(
^
)开始,以(
$
)结束。

如果我听你的问题,你可以用这样的空格-

Pattern p = Pattern.compile("^[ ]+$", Pattern.UNICODE_CHARACTER_CLASS);
String[] inputs = {" ", "  ", " \t", "Hello"};
for (String input : inputs) {
    Matcher m = p.matcher(input);
    System.out.printf("For input: '%s' = %s%n", input, m.find());
}
输出为

For input: ' ' = true
For input: '  ' = true
For input: '    ' = false
For input: 'Hello' = false
For input: '    ' = true
For input: '        ' = true
For input: '    ' = false
For input: 'Hello' = false
和标签

Pattern p = Pattern.compile("^[\t]+$", Pattern.UNICODE_CHARACTER_CLASS);
String[] inputs = {"\t", "\t\t", " \t", "Hello"};
for (String input : inputs) {
    Matcher m = p.matcher(input);
    System.out.printf("For input: '%s' = %s%n", input, m.find());
}
输出为

For input: ' ' = true
For input: '  ' = true
For input: '    ' = false
For input: 'Hello' = false
For input: '    ' = true
For input: '        ' = true
For input: '    ' = false
For input: 'Hello' = false

最后,使用
*
而不是
+
进行0或更多匹配。这将使用
+
,因此需要1个或多个匹配项。以(
^
)开头,以(
$
)结尾。

所以你可以说:Pattern spaces=Pattern.compile([^\\S\\t\\r\\n]”,Pattern.UNICODE\u CHARACTER\u CLASS);Pattern tabs=Pattern.compile(“[^\\S\\r\\n]”,Pattern.UNICODE\u CHARACTER\u CLASS)@戈弗汗:是的,就是这个想法。所以你可以这样说:Pattern spaces=Pattern.compile(“[^\\S\\t\\r\\n]”,Pattern.UNICODE\u CHARACTER\u CLASS);Pattern tabs=Pattern.compile(“[^\\S\\r\\n]”,Pattern.UNICODE\u CHARACTER\u CLASS)@戈弗汗:是的,就是这个想法。所以你可以这样说:Pattern spaces=Pattern.compile(“[^\\S\\t\\r\\n]”,Pattern.UNICODE\u CHARACTER\u CLASS);Pattern tabs=Pattern.compile(“[^\\S\\r\\n]”,Pattern.UNICODE\u CHARACTER\u CLASS)@戈弗汗:是的,就是这个想法。所以你可以这样说:Pattern spaces=Pattern.compile(“[^\\S\\t\\r\\n]”,Pattern.UNICODE\u CHARACTER\u CLASS);Pattern tabs=Pattern.compile(“[^\\S\\r\\n]”,Pattern.UNICODE\u CHARACTER\u CLASS)@戈弗汗:是的,这就是我的想法。我正在考虑使用
\p{z}
,它表示“任何类型的空白或不可见的分隔符”,而不是
\s
。虽然我不确定你的问题是什么。例如,让我困惑的是
\u00FF
。你的正则表达式在做什么(
ÿ
在我看来不像空格或制表符)?你所说的“在Javascript中这相当简单”是什么意思\u00FF是一个打字错误。很抱歉。Javascript进入基于unicode的页面,打开检查器,执行document.body.innerText.match(/\/g);匹配所有空格都很好。但是,Java中的相同空格regex,即使使用Pattern.compile(“,Pattern.UNICODE\u CHARACTER\u CLASS)似乎也不起作用。我正在考虑使用
\p{z}
,它表示“任何类型的空白或不可见分隔符”,而不是
\s
。虽然我不确定你的问题是什么。例如,让我困惑的是
\u00FF
。你的正则表达式在做什么(
ÿ
在我看来不像空格或制表符)?你所说的“在Javascript中这相当简单”是什么意思\u00FF是一个打字错误。很抱歉。Javascript进入基于unicode的页面,打开检查器,执行document.body.innerText.match(/\/g);匹配所有空格都很好。但是,Java中的相同空格regex,即使使用Pattern.compile(“,Pattern.UNICODE\u CHARACTER\u CLASS)似乎也不起作用。我正在考虑使用
\p{z}
,它表示“任何类型的空白或不可见分隔符”,而不是
\s
。虽然我不确定你的问题是什么。例如,让我困惑的是
\u00FF
。在你的正则表达式中正在做什么