除非在特定情况下如何匹配单个字符
How to match a single character except when on a specific situation
我有一个字符串,我想在每个分号处拆分成多个部分 ;
。
我正在为此使用 JAVA String.split(regex)
,创建一个字符串数组。
示例:
string 1;
string 2;
string 3;
string 4 (
substring 1;
substring 2;
substring 3;
);
string 4;
我现在正在使用 line.split("\s*;\s*");
...
但是,正如预期但不想要的那样,让我回来了 ["string 1", "string 2", "string 3", "string 4 (\nsubstring 1", "substring 2", "substring 3", ")", "string 4", ""]
。
那么我如何匹配每个 ;
以便我可以拆分它除了括号内的那些(子字符串之后的那些)?
编辑:
我确实设法创建了一个正则表达式来匹配“;”在括号内,但不在括号外......但是在使用逻辑并将 ~(a^b)
转换为 ~av~b
(de morgan law)之后,我确实制作了一个正则表达式来匹配“;”括号外。
但它仍然不起作用,并且仍然在每个分号处中断...它与 Java 本身有关吗?
当前模式:((?<![\S\s]*?\([\S\s]*?)|(?![\S\s]*?\)[\S\s]*?));
我相信一些 Java 专业人士有比正则表达式更好的解决方案,但这可能有点接近研究:
.*\((?:\s*(?:[^\r\n]*;)\s*)+\);|[^\r\n]+
我猜你可能想要 trim
并将其推送到数组。
测试
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegularExpression{
public static void main(String[] args){
final String regex = ".*\((?:\s*(?:[^\r\n]*;)\s*)+\);|[^\r\n]+";
final String string = "string 1;\n"
+ "string 2;\n"
+ "string 3;\n"
+ "string 4 (\n"
+ " substring 1;\n"
+ " substring 2;\n"
+ " substring 3;\n"
+ ");\n"
+ "string 4;\n"
+ "string 1;\n"
+ "string 2;\n"
+ "string 3;\n"
+ "string 4 (\n"
+ " substring 1;\n"
+ " substring 2;\n"
+ " substring 3;\n"
+ ");\n"
+ "string 4;";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
输出
Full match: string 1;
Full match: string 2;
Full match: string 3;
Full match: string 4 (
substring 1;
substring 2;
substring 3;
);
Full match: string 4;
Full match: string 1;
Full match: string 2;
Full match: string 3;
Full match: string 4 (
substring 1;
substring 2;
substring 3;
);
Full match: string 4;
如果您希望 simplify/modify/explore 表达式,regex101.com. If you'd like, you can also watch in this link 的右上面板已对其进行说明,它将如何匹配一些示例输入。
使用这个:
String[] array = line.split("(?<\!\(.*[^)]);");
代码如下:
导入java.util.Arrays;
public class 测试 {
public static void main(String[] args) {
String line = "string 1;" +
"string 2;" +
"string 3;" +
"string 4 (" +
" substring 1;" +
" substring 2;" +
" substring 3;" +
");" +
"string 4;";
System.out.println(line);
System.out.println();
String[] array = line.split("(?<!\(.*[^)]);");
System.out.println(
Arrays.toString(array)); // Arrays.toString(Object[] a) converts an array to a printable string.
}
}
打印:
字符串 1;字符串 2;字符串 3;字符串 4(子字符串 1;子字符串 2;子字符串 3;);字符串 4;
[字符串 1,字符串 2,字符串 3,字符串 4(子字符串 1;子字符串 2;子字符串 3;),字符串 4;]
我有一个字符串,我想在每个分号处拆分成多个部分 ;
。
我正在为此使用 JAVA String.split(regex)
,创建一个字符串数组。
示例:
string 1;
string 2;
string 3;
string 4 (
substring 1;
substring 2;
substring 3;
);
string 4;
我现在正在使用 line.split("\s*;\s*");
...
但是,正如预期但不想要的那样,让我回来了 ["string 1", "string 2", "string 3", "string 4 (\nsubstring 1", "substring 2", "substring 3", ")", "string 4", ""]
。
那么我如何匹配每个 ;
以便我可以拆分它除了括号内的那些(子字符串之后的那些)?
编辑:
我确实设法创建了一个正则表达式来匹配“;”在括号内,但不在括号外......但是在使用逻辑并将 ~(a^b)
转换为 ~av~b
(de morgan law)之后,我确实制作了一个正则表达式来匹配“;”括号外。
但它仍然不起作用,并且仍然在每个分号处中断...它与 Java 本身有关吗?
当前模式:((?<![\S\s]*?\([\S\s]*?)|(?![\S\s]*?\)[\S\s]*?));
我相信一些 Java 专业人士有比正则表达式更好的解决方案,但这可能有点接近研究:
.*\((?:\s*(?:[^\r\n]*;)\s*)+\);|[^\r\n]+
我猜你可能想要 trim
并将其推送到数组。
测试
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegularExpression{
public static void main(String[] args){
final String regex = ".*\((?:\s*(?:[^\r\n]*;)\s*)+\);|[^\r\n]+";
final String string = "string 1;\n"
+ "string 2;\n"
+ "string 3;\n"
+ "string 4 (\n"
+ " substring 1;\n"
+ " substring 2;\n"
+ " substring 3;\n"
+ ");\n"
+ "string 4;\n"
+ "string 1;\n"
+ "string 2;\n"
+ "string 3;\n"
+ "string 4 (\n"
+ " substring 1;\n"
+ " substring 2;\n"
+ " substring 3;\n"
+ ");\n"
+ "string 4;";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
输出
Full match: string 1;
Full match: string 2;
Full match: string 3;
Full match: string 4 (
substring 1;
substring 2;
substring 3;
);
Full match: string 4;
Full match: string 1;
Full match: string 2;
Full match: string 3;
Full match: string 4 (
substring 1;
substring 2;
substring 3;
);
Full match: string 4;
如果您希望 simplify/modify/explore 表达式,regex101.com. If you'd like, you can also watch in this link 的右上面板已对其进行说明,它将如何匹配一些示例输入。
使用这个:
String[] array = line.split("(?<\!\(.*[^)]);");
代码如下:
导入java.util.Arrays;
public class 测试 {
public static void main(String[] args) {
String line = "string 1;" +
"string 2;" +
"string 3;" +
"string 4 (" +
" substring 1;" +
" substring 2;" +
" substring 3;" +
");" +
"string 4;";
System.out.println(line);
System.out.println();
String[] array = line.split("(?<!\(.*[^)]);");
System.out.println(
Arrays.toString(array)); // Arrays.toString(Object[] a) converts an array to a printable string.
}
}
打印:
字符串 1;字符串 2;字符串 3;字符串 4(子字符串 1;子字符串 2;子字符串 3;);字符串 4;
[字符串 1,字符串 2,字符串 3,字符串 4(子字符串 1;子字符串 2;子字符串 3;),字符串 4;]