如何识别字符串中的字符串模式,但如果匹配属于已识别的模式,则忽略

时间:2011-02-15 17:25:01

标签: java string design-patterns matching

我想在字符串中搜索与特定模式匹配的字符串的出现。 然后我将编写由逗号分隔的找到的字符串的唯一列表。 只要该模式不属于"$FOR_something""#LOOKING( )"且_something部分没有任何其他特殊字符,该模式就是查找"/* */"

例如,如果我有这个字符串,

  "Not #LOOKING( $FOR_one $FOR_two) /* $FOR_three */ not $$$FOR_four or $FOR_four_b, but $FOR_five; and $FOR_six and not $FOR-seven or $FOR_five again"

我从上面引用的字符串中找到的找到的模式列表将是:

$FOR_five, $FOR_six

我从这个例子开始:

import java.lang.StringBuffer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class testIt {
public static void main(String args[]) {

String myWords = "Not #LOOKING( $FOR_one $FOR_two) /* $FOR_three */ not $$$FOR_four or $FOR_four_b, but $FOR_five; and $FOR_six and not $FOR-seven or $FOR_five again";

StringBuffer sb = new StringBuffer(0);

if ( myWords.toUpperCase().contains("$FOR") )
{
   Pattern p = Pattern.compile("\\$FOR[\\_][a-zA-Z_0-9]+[\\s]*", Pattern.CASE_INSENSITIVE);
   Matcher m = p.matcher(myWords);

   String myFors = "";
   while (m.find())
   {
      myFors = myWords.substring( m.start() , m.end() ).trim();
      if ( sb.length() == 0 ) sb = sb.append(myFors);
      else
      {
         if ( !(sb.toString().contains(myFors))) sb = sb.append(", " + myFors );
      }
   }
}
System.out.println(sb);
}

}

但它没有给我我想要的东西。我想要的是:

$FOR_five, $FOR_six 

相反,我获得了所有$ FOR_somethings。我不知道如何忽略/**/#LOOKING()内部的出现。 有什么建议?

1 个答案:

答案 0 :(得分:0)

这个问题超出了我想说的常规正则表达式。 $$$模式可以通过负面的后观来修复,其他模式也不会那么容易。

我建议您首先使用标记化/手动字符串解析来丢弃不需要的数据,例如/* ... */#LOOKING( .... )。然而,这也可以通过另一个正则表达式删除,例如:

myWords.replaceAll("/\\*[^*/]+\\*/", "");      // removes /* ... */
myWords.replaceAll("#LOOKING\\([^)]+\\)", ""); // removes #LOOKING( ... )

一旦删除基于上下文的内容,您可以使用e..g,以下正则表达式:

(?<!\\$)\\$FOR_\\p{Alnum}+(?=[\\s;])

说明:

(?<!\\$)         // Match iff not prefixed with $
\\$FOR_          // Matches $FOR_
\\p{Alnum}+      // Matches one or more alphanumericals [a-zA-Z0-9]
(?=[\\s;])       // Match iff followed by space or ';'

请注意,所使用的(?...)被称为先行/后视表达式,它们不会在结果本身中捕获。它们仅作为上述示例中的前缀/后缀条件。