为什么我在使用replacefirst时得到不同的输出

时间:2017-04-28 10:02:21

标签: 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/inventory_query_update_Ciena.sql";
System.out.println(a.replaceFirst(".*/.[^(sql|plsql)]*/", ""));
System.out.println(b.replaceFirst(".*/.[^(sql|plsql)]*/", ""));
    }

两者都应该得到输出AS

sql/inv_insert_crdtypedet_faultyprt_chk_typ_r3450.sql
sql/inventory_query_update_Ciena.sql

但我得到了以下输出

PeportsUI/sql/inv_insert_crdtypedet_faultyprt_chk_typ_r3450.sql
sql/inventory_query_update_Ciena.sql

为什么请解释一下?

1 个答案:

答案 0 :(得分:0)

您当前的正则表达式存在一些问题。您似乎尝试使用字符类sql来表达 not 匹配plsql[^(sql|plsql)]。但这不会按预期工作,这实际上意味着不匹配括号内的任何字符。如果你想采用这种方法,你必须使用某种方法来做到这一点。但是,我认为可以编写一个简单的正则表达式,如下所示。

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/inv_insert_crdtypedet_faultyprt_chk_typ_r3450.sql
sql/inventory_query_update_Ciena.sql
plsql/inv_insert_crdtypedet_faultyprt_chk_typ_r3450.sql

在这里演示:

Rextester