我想在字符串中搜索与特定模式匹配的字符串的出现。
然后我将编写由逗号分隔的找到的字符串的唯一列表。
只要该模式不属于"$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()
内部的出现。
有什么建议?
答案 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 ';'
请注意,所使用的(?...)
被称为先行/后视表达式,它们不会在结果本身中捕获。它们仅作为上述示例中的前缀/后缀条件。