gpt4 book ai didi

java - 如何分割字符串并保留特定的分隔符?

转载 作者:行者123 更新时间:2023-11-30 05:41:30 26 4
gpt4 key购买 nike

我正在编写一些需要接受用户计算器输入的代码,因此作为其中的一部分,我想我会使用正则表达式来标记输入字符串,但是标记字符串本身无法对小数和“]”进行单元测试.

我首先使用我看到的前向和后向方法 here .

我用 "((?<=[+-/*(){^}[%]π])|(?=[+-/*(){^}[%]π]))"; 写的它编译并成功运行,但如果有带小数的数字则失败。

我回去并尝试了与链接问题中接受的答案相同的方式,使用 "[+-/*\\^%(){}[]]" (下面的正则表达式3)有或没有π,因为我的第一直觉是导致问题的字符,但在这两种情况下,它都导致 Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 41
((?<=[+-/*\^%(){}[]])|(?=[+-/*\^%(){}[]]))

此时,我回到第一次尝试并重新排列了术语,"((?<=[+-/*^%(){}[]π])|(?=[+-/*^%(){}[]π]))"; (下面的 regex2)但是这个在最后一个括号上也有相同的 PatternSyntaxException。

在代码中显示问题可能会更容易,我编写了一个类来运行三个不同的正则表达式类尝试:

import java.util.Arrays;
public class RegexProblem {
/** This Delimiter string came from {@link https://stackoverflow.com/a/2206432/} */
static public final String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))";


// Split on and include + - * / ^ % ( ) [ ] { } π
public static void main(String[] args) {

String regex1="((?<=[+-/*(){^}[%]π])|(?=[+-/*(){^}[%]π]))";
String regex2="((?<=[+-/*^%(){}[]π])|(?=[+-/*^%(){}[]π]))";
String regex3="[+-/*\\^%(){}[]]";

String str="1.2+3-4^5*6/(78%9π)+[{0+-1}*2]";
String str2="[1.2+3]*4";


String[] expected={"1.2","+","3","-","4","^","5","*","6","(","78","%",
"9","π",")","+","[","{","0","+","-","1","}","*","2","]"};
String[] expected2={"[","1.2","+","3","]","*","4"};


System.out.println("Expected: ");
System.out.print("str: ");
System.out.println(Arrays.toString(expected));
System.out.print("str2: ");
System.out.println(Arrays.toString(expected2));
System.out.println();


System.out.println();
System.out.println("Regex1: ");
System.out.print("str: ");
System.out.println(Arrays.toString(str.split(regex1)));
System.out.print("str2: ");
System.out.println(Arrays.toString(str2.split(regex1)));
System.out.println();
System.out.println("Regex2: ");
System.out.print("str: ");
System.out.println(Arrays.toString(str.split(regex2)));
System.out.print("str2: ");
System.out.println(Arrays.toString(str2.split(regex2)));
System.out.println();
System.out.println("Regex3: ");
System.out.print("str: ");
System.out.print(Arrays.toString(str.split(String.format(WITH_DELIMITER, regex3))));
System.out.print("str2: ");
System.out.print(Arrays.toString(str2.split(String.format(WITH_DELIMITER, regex3))));

}

}

运行 regex2 和 regex 3 都失败了,但令我困惑的是 regex1 的行为,即使它看起来与其他的结束字符数量相同,并且使用“.”进行分割,它也会运行。但不是“]”。

最佳答案

试试这个:

(?<=[^\d.])|(?=[^\d.])

说明:

  • \d[0-9] 的简写,所以任何数字。
  • .方括号内的仅匹配文字点,它似乎始终是示例输入中数字的一部分。因此,[\d.]我们将用它来识别数字字符。
  • [^\d.]匹配非数字字符(carat ^ 否定字符类)。
  • (?<=[^\d.])匹配前面有非数字字符的点。
  • 备用(?=[^\d.])匹配后跟非数字字符的点。

关于java - 如何分割字符串并保留特定的分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55543238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com