Java正则表达式匹配但String.replaceAll()不替换匹配的子字符串

时间:2018-02-27 15:49:46

标签: java regex string replaceall

true
Nørrebro, Denmark

这给了我以下输出:

import java.util.Arrays;
import java.util.Scanner;

public class Scann {
    Scanner s;

    Scann() {
        s = new java.util.Scanner(System.in);
        System.out.println("Enter string : \n");

        String str = s.nextLine();
        str = str.replaceAll("[^-?0-9]+", " ");
        System.out.println(Arrays.asList(str.trim().split(" ")));
    }

    public static void main(String args[]) {

        new Scann();
    }

}

怎么可能?为什么replaceAll()没有注册匹配?

4 个答案:

答案 0 :(得分:2)

您的正则表达式包括ALTER TRIGGER [dbo].[UpdateTransport] ON [dbo].[MVF_Transport_Register] AFTER UPDATE AS BEGIN UPDATE c SET c.Record_Status = i.Record_status FROM MVF_SYSTEMS.dbo.MVF_Transport_Acc AS c INNER JOIN inserted AS i ON c.Order_No = i.Order_No AND c.Record_Status <> i.Record_Status WHERE i.Record_Status IN ('CONFIRMED', 'AMENDED') AND i.Price > 0; IF @@ROWCOUNT = 0 BEGIN INSERT INTO MVF_SYSTEMS.dbo.MVF_Transport_Acc ([Order_No], [Record_Status], [Notes], [Transport_Supplier], [Surcharge], [Vendor_No], [Pallets], [Amend_Pallets],[Price], [Input_Date], [Amend_Price], [Transport_Invoice_No],[Transport_Job_No], [Amend_Date], [Report_Price], [Return_Price], [Report_Date]) SELECT i.[Order_No], i.[Record_Status], i.[Notes], i.[Transport_Supplier], i.[Surcharge], i.[Vendor_No], i.[Pallets], i.[Amend_Pallets], i.[Price], i.[Input_Date], i.[Amend_Price], i.[Transport_Invoice_No], i.[Transport_Job_No], i.[Amend_Date], i.[Report_Price], i.[Return_Price], i.[Report_Date] FROM inserted AS i WHERE i.Record_Status IN ('CONFIRMED', 'AMENDED') AND i.Price > 0; END END 。这使得正则表达式从一开始就匹配。

如果您尝试

^

您将获得test1.matches(regex)

答案 1 :(得分:2)

您需要了解^$的含义。

你可能会把它们放在那里,因为你想说:

  

在每场比赛的开始,我想要一个&,然后是0个或更多非空白字符,然后是结束时的;

但是,^$并不代表每个匹配的开头和结尾。它表示字符串的开头和结尾

因此,您应该从正则表达式中删除^$

String regex = "&\\S*;";

现在输出:

true
Nrrebro, Denmark

&#34;什么字符指定匹配的开始和结束然后?&#34;你可能会问。好吧,因为你的正则表达式基本上是你匹配的模式,正则表达式的开头是匹配的开始(除非你有lookbehinds)!

答案 2 :(得分:1)

这是可能的,因为^&\S*;$模式匹配整个&oslash;字符串,但它与整个N&oslash;rrebro, Denmark字符串不匹配。 ^匹配(此处需要)字符串的开头位于&之前,$要求;出现在字符串的末尾。

仅删除^$ 主播可能不起作用,因为\S*是一种贪婪模式,并且它可能超匹配,例如在N&oslash;rrebro;

您可以使用&\w+;&\S+?;模式,例如:

String test1 = "N&oslash;rrebro, Denmark";
String regex = "&\\w+;";
String value = test1.replaceAll(regex,"");
System.out.println(value); // => Nrrebro, Denmark

请参阅Java demo

&\w+;模式匹配&,然后匹配字符串内的任何1个字符,然后是;\S*?匹配除空白之外的任何0+字符。

答案 3 :(得分:1)

您可以使用此正则表达式:&(.*?);

        String test1 = "N&oslash;rrebro, Denmark";
        String test2 = "&oslash;";
        String regex = new String("&(.*?);");
        String value = test1.replaceAll(regex,"");
        System.out.println(test2.matches(regex));
        System.out.println(value);

输出:

true 
Nrrebro, Denmark