如何使用java在正则表达式中转义星号

时间:2015-07-31 07:56:27

标签: java regex

我有以下模式:

<* ab: cdef *>
<************>
abc: <starting now>

我需要转义具有&lt; * pattern。

的行

我使用\\*\\\\*来逃避\和*。但这不起作用

如何使用Java转义正则表达式中的*?

我无法逃脱线条有&lt;单独,因为其他行也将被跳过。

我使用了以下代码:

if(str.matches("<\\*.*")) {
                //Do nothing.
}
使用BufferedReader初始化

str,如下所示:

FileInputStream fstream = new FileInputStream(filename);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String str = br.readLine(); 

3 个答案:

答案 0 :(得分:3)

要在正则表达式中转义*,您需要使用双反斜杠\\*,因为*是正则表达式中的特殊字符。

你也可以试试这个(如果你希望这个模式出现在行的开头,就像在你的例子中一样):

if (str.trim().startsWith("<*")) {
    //your code
}

因此,如果您希望模式出现在字符串中的任何位置,您可以使用:

if (str.contains("<*")) {
    //your code
}

而且我很确定你不需要这些简单案例的正则表达式。

答案 1 :(得分:2)

您还应该在&#39;&lt;&#39;之前匹配空格。字符,如

var app=angular.module('hz',[]);
 app.controller('ceilometerCtrl', function($scope, $http){
     //$scope.name="Neelabh";
     $http.get("data.json")
     .success(function(response){
         $scope.metrics=response.nova_meters.concat(response.glance_meters);
         $scope.metric =  $scope.metrics[0];
         $scope.groups=[{"name": "Project", "label": "Project"}];
         $scope.group_by = $scope.groups[0];
         //$scope.group_by=$scope.groups[0];
     });
     $scope.stats_attrs=[
      {
            "name": "Avg",          
            "label": "Avg"            
      },
      {
            "name": "Min",          
            "label": "Min"            
      },
      {
            "name": "Max",          
            "label": "Max"            
      },
      {
            "name": "Sum",          
            "label": "Sum"            
      },
   ];

   $scope.stats_attr = $scope.stats_attrs[0];
   $scope.date_options=[
      {
           "value" : 1,
           "label" : "Last day"
      },
      {
           "value" : 7,
           "label" : "Last week"
      },
      {
           "value" : 23,
           "label" : "Month to date"
      },
      {
           "value" : 30,
           "label" : "Last 30 days"
      },
      {
           "value" : 356,
           "label" : "Last year"
      },
      {
           "value" : "Other",
           "label" : "Other"
      }
   ];

   $scope.date_option = $scope.date_options[1];
 });

if(str.trim().matches("<\\*.*")) { //Do nothing. }

您还应该迭代地阅读下一行,例如:

str.matches("\\s*<\\*.*")

(从OP中不清楚)

答案 2 :(得分:1)

可能认为该模式不匹配,因为调试器无法在空的if块内停止 - 什么都不做总是不好的做法:做某事而不是!

您的模式已经符合以下情况:

String str = "<* ab: cdef *>";
if(str.matches("<\\*.*")) {
    //do something
    System.out.println("matches");
}

以上打印匹配

如果您不希望考虑额外的前导空格,可以使用匹配零个或多个前导空白字符的此模式" *<\\*.*"