Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使用正则表达式将字符串解析为变量_Java_Regex - Fatal编程技术网

Java使用正则表达式将字符串解析为变量

Java使用正则表达式将字符串解析为变量,java,regex,Java,Regex,我需要从字符串中提取变量 String format = "x:y"; String string = "Marty:McFly"; 然后 但是格式可以是任何东西,它可以是这样的y?x=>McFly?Marty 如何使用regex解决这个问题 编辑:当前解决方案 String delimiter = format.replace(Y, ""); delimiter = delimiter.replaceAll(X, ""); delimiter

我需要从字符串中提取变量

String format = "x:y";
String string = "Marty:McFly";
然后

但是格式可以是任何东西,它可以是这样的y?x=>McFly?Marty

如何使用regex解决这个问题

编辑:当前解决方案

        String delimiter = format.replace(Y, "");
        delimiter = delimiter.replaceAll(X, "");
        delimiter = "\\"+delimiter;

        String strings[] = string.split(delimiter);

        String x; 
        String y;
        if(format.startsWith(X)){
             x = strings[0];
             y = strings[1];
        }else{
             y = strings[0];
             x = strings[1];
        }

        System.out.println(x);
        System.out.println(y);

这很好,但我更喜欢干净的溶液

根本不需要正则表达式

public static void main(String[] args) {
    test("x:y", "Marty:McFly");
    test("y?x", "McFly?Marty");
}
public static void test(String format, String input) {
    if (format.length() != 3 || Character.isLetterOrDigit(format.charAt(1))
                             || (format.charAt(0) != 'x' || format.charAt(2) != 'y') &&
                                (format.charAt(0) != 'y' || format.charAt(2) != 'x'))
        throw new IllegalArgumentException("Invalid format: \"" + format + "\"");
    int idx = input.indexOf(format.charAt(1));
    if (idx == -1 || input.indexOf(format.charAt(1), idx + 1) != -1)
        throw new IllegalArgumentException("Invalid input: \"" + input + "\"");
    String x, y;
    if (format.charAt(0) == 'x') {
        x = input.substring(0, idx);
        y = input.substring(idx + 1);
    } else {
        y = input.substring(0, idx);
        x = input.substring(idx + 1);
    }
    System.out.println("x = " + x);
    System.out.println("y = " + y);
}
输出

x=Marty
y=McFly
x=马蒂
y=McFly

如果格式字符串可以更改为正则表达式,则使用将使其非常简单:

public static void main(String[] args) {
    test("(?<x>.*?):(?<y>.*)", "Marty:McFly");
    test("(?<y>.*?)\\?(?<x>.*)", "McFly?Marty");
}
public static void test(String regex, String input) {
    Matcher m = Pattern.compile(regex).matcher(input);
    if (! m.matches())
        throw new IllegalArgumentException("Invalid input: \"" + input + "\"");
    String x = m.group("x");
    String y = m.group("y");
    System.out.println("x = " + x);
    System.out.println("y = " + y);
}
publicstaticvoidmain(字符串[]args){
测试((?*?:(?*),“Marty:McFly”);
测试(“(?*?\ \?(?*”,“McFly?Marty”);
}
公共静态无效测试(字符串正则表达式、字符串输入){
Matcher m=Pattern.compile(regex).Matcher(input);
如果(!m.matches())
抛出新的IllegalArgumentException(“无效输入:\”“+input+”\”);
字符串x=m.group(“x”);
字符串y=m.group(“y”);
System.out.println(“x=”+x);
System.out.println(“y=“+y”);
}

与上面相同的输出,包括值顺序。

您可以使用以下正则表达式
(\\w)(\\w)(\\w)

这将查找任何字母数字字符,后跟任何非字母数字字符,后跟另一组字母数字字符。括号将对查找进行分组,因此组1将是参数1,组2将是分隔符,组3将是参数2

比较参数1和参数2可以确定它们的词法顺序

样本

  public static void main(String[] args)  {
    testString("x:y", "Marty:McFly");
    testString("x?y", "Marty?McFly");
    testString("y:x", "Marty:McFly");
    testString("y?x", "Marty?McFly");
  }

  /**
   * 
   */
  private static void testString(String format, String string) {
    String regex = "(\\w)(\\W)(\\w)";

    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(format);

    if (!matcher.find()) throw new IllegalArgumentException("no match found");

    String delimiter = matcher.group(2);

    String param1 = matcher.group(1); 
    String param2 = matcher.group(3); 


    String[] split = string.split("\\" + delimiter);
    String x;
    String y;
    switch(param1.compareTo(param2)) {
      case 1:
        x = split[1];
        y = split[0];
        break;
      case -1:
      case 0:
      default:
        x = split[0];
        y = split[1];
    };

    System.out.println("String x: " + x);
    System.out.println("String y: " + y);

    System.out.println(String.format("%s%s%s", x, delimiter, y));
    System.out.println();
  }

这种方法将允许您使用任何类型的格式,而不仅仅是x和y。您可以使用与正则表达式匹配的任何格式。

这听起来像是XY问题。你确定你不想要一个
映射
?是的,你可以用正则表达式来做这件事,只要你学会了足够的正则表达式来编写模式。你需要编写一些Java代码。我有一个解决方案,可以找到一个分隔符,然后拆分字符串,看哪个值是第一个值并赋值,但必须有更好的方法。一个简单问题的复杂解决方案。Op既可以硬编码分隔符,也可以使用正则表达式simplify@locus2kOP询问在提供
格式
字符串和
输入
字符串时,如何提取
x
y
的值,其中
格式
字符串指定分隔符和
x
y
。这就是答案。因为这就是OP收到的,所以没有“硬代码分隔符”或“使用正则表达式简化”。这与我的解决方案几乎相同,从逻辑角度看,它是有效的,但我想问是否有其他方法来简化它,或者使用不同的方法(可能是正则表达式)?我真的不知道,这就是我寻求建议的原因。@Edalol如果您的解析规范是您正在显示的
格式
字符串,则解析逻辑必须确定分隔符以及该格式字符串的
x
vs
y
顺序,则不会这样做。现在,如果解析逻辑可以接收一个正则表达式作为解析规范,那就不同了。是的,这正是我的目标,因为格式可以是name:names,例如!如果是这种情况,则必须将正则表达式更改为
(\\w+)(\\w+)(\\w+)
,因为当前正则表达式只在非字母数字的两侧查找1个字母数字
  public static void main(String[] args)  {
    testString("x:y", "Marty:McFly");
    testString("x?y", "Marty?McFly");
    testString("y:x", "Marty:McFly");
    testString("y?x", "Marty?McFly");
  }

  /**
   * 
   */
  private static void testString(String format, String string) {
    String regex = "(\\w)(\\W)(\\w)";

    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(format);

    if (!matcher.find()) throw new IllegalArgumentException("no match found");

    String delimiter = matcher.group(2);

    String param1 = matcher.group(1); 
    String param2 = matcher.group(3); 


    String[] split = string.split("\\" + delimiter);
    String x;
    String y;
    switch(param1.compareTo(param2)) {
      case 1:
        x = split[1];
        y = split[0];
        break;
      case -1:
      case 0:
      default:
        x = split[0];
        y = split[1];
    };

    System.out.println("String x: " + x);
    System.out.println("String y: " + y);

    System.out.println(String.format("%s%s%s", x, delimiter, y));
    System.out.println();
  }