【发布时间】:2017-04-14 12:17:04
【问题描述】:
我有这个字母表:{'faa','fa','af'} 我有这个字符串:“faaf”
我有这个正则表达式:“(faa|fa|af)*”,它可以帮助我将字符串与字母表匹配。
如何让 Java 将我的字符串修剪为:{fa,af},这是根据我的字母表编写字符串的正确方法:“faaf”?
这是我的代码:
String regex = "(faa|fa|af)*";
String str = "faaf";
boolean isMatch = Pattern.matches(regex, str);
if(isMatch)
{
//trim the string
while(str.length()!=0)
{
Pattern pattern = Pattern.compile("^(faa|fa|af)(faa|fa|af)*$");
Matcher mc = pattern.matcher(str);
if (mc.find())
{
String l =mc.group(1);
alphabet.add(l);
str = str.substring(l.length());
System.out.println("\n"+ l);
}
}
}
感谢 Aaron 帮助我解决了这个问题。
【问题讨论】:
-
我认为您可以在正则表达式中添加锚点,让正则表达式引擎找出与整个文本匹配的组合
-
我上面的代码就是这样做的。我想要的是连接起来生成单词的字母
-
这似乎不是一个好主意,但您可以匹配
^(faa|fa|af)(faa|fa|af)*$,将第一组添加到令牌列表中,将其从输入字符串中删除,然后返回步骤 1 并缩短输入直到为空 -
非常感谢亚伦先生!你让我开心。
-
不客气!我是说这不是一个好主意,因为它在每个标记之后“回溯”,而您只需要在模棱两可的标记上回溯,因此它的执行效率低下。现在,如果您考虑制作自己的解析器必须做的工作,它可能是最有效的解决方案之一;)