Regex 为什么使用replacefirst时会得到不同的输出

Regex 为什么使用replacefirst时会得到不同的输出,regex,Regex,对于这两种情况,我应该以 public static void main(String[] args) { // TODO Auto-generated method stub String a="/Construction/src/Inventory/PeportsUI/sql/inv_insert_crdtypedet_faultyprt_chk_typ_r3450.sql"; String b="/Construction/src/Inventory/UI/sql/inve

对于这两种情况,我应该以

public static void main(String[] args) {
        // TODO Auto-generated method stub
String a="/Construction/src/Inventory/PeportsUI/sql/inv_insert_crdtypedet_faultyprt_chk_typ_r3450.sql";
String b="/Construction/src/Inventory/UI/sql/inventory_query_update_Ciena.sql";
System.out.println(a.replaceFirst(".*/.[^(sql|plsql)]*/", ""));
System.out.println(b.replaceFirst(".*/.[^(sql|plsql)]*/", ""));
    }
但我得到的是以下输出

sql/inv_insert_crdtypedet_faultyprt_chk_typ_r3450.sql
sql/inventory_query_update_Ciena.sql

为什么请解释一下?

您当前的正则表达式有一些问题。似乎您试图使用字符类
[^(sql | plsql)]
表示不匹配的
sql
plsql
。但这不会像预期的那样工作,这实际上意味着不匹配括号内的任何字符。如果你想采用这种方法,你就必须使用某种环视来实现这一点。然而,我认为可以编写一个简单的正则表达式,如果使用下面的措辞

PeportsUI/sql/inv_insert_crdtypedet_faultyprt_chk_typ_r3450.sql
sql/inventory_query_update_Ciena.sql
输出:

public static void main(String args[]) {
    String a = "/Construction/src/Inventory/PeportsUI/sql/inv_insert_crdtypedet_faultyprt_chk_typ_r3450.sql";
    String b = "/Construction/src/Inventory/UI/sql/inventory_query_update_Ciena.sql";
    String c = "/Construction/src/Inventory/PeportsUI/plsql/inv_insert_crdtypedet_faultyprt_chk_typ_r3450.sql";
    System.out.println(a.replaceFirst(".*/((?:sql|plsql).*)", "$1"));
    System.out.println(b.replaceFirst(".*/((?:sql|plsql).*)", "$1"));
    System.out.println(c.replaceFirst(".*/((?:sql|plsql).*)", "$1"));
}
此处演示:

public static void main(String args[]) {
    String a = "/Construction/src/Inventory/PeportsUI/sql/inv_insert_crdtypedet_faultyprt_chk_typ_r3450.sql";
    String b = "/Construction/src/Inventory/UI/sql/inventory_query_update_Ciena.sql";
    String c = "/Construction/src/Inventory/PeportsUI/plsql/inv_insert_crdtypedet_faultyprt_chk_typ_r3450.sql";
    System.out.println(a.replaceFirst(".*/((?:sql|plsql).*)", "$1"));
    System.out.println(b.replaceFirst(".*/((?:sql|plsql).*)", "$1"));
    System.out.println(c.replaceFirst(".*/((?:sql|plsql).*)", "$1"));
}

你能给我解释一下为什么第一个代码不起作用吗?我已经解释过,
[^(sql | plsql)]
没有按照你的想法去做。我的回答使用了固定的模式,但您也可以使用lookaround。但是,当sql或plsql之前的单词长度小于3个字符时,为什么这会起作用,就像字符串b中的情况一样,也就是说,在一系列注释中解释regex的基本内容是无效的。使用类似的工具测试您的模式和我的模式,并查看每个模式的行为。感谢您的帮助。我已经理解了为什么我无法获得预期的输出