我在试着测试摩尔斯电码是否合法。
public static boolean isMorseCode( String code ){
return code.trim().matches("[+.|+\s|+-]");
}摩尔斯电码行可以以. (称为Dit)和- (称为Dah)开头。它可以在行中有空格。两个特定代码之间的1个空格,如.- -.,在本例中,仅由一个空格分隔的代码之和是一个单词。但它也可以有3个空格,然后一个新词开始。我使用trim来排除在行首和行尾可能有空格的事实。
下面是一个更清晰的例子。
我们用"Hello World“来解释。空格是通过发布它们来清除的,所以看看http://www.rubular.com/r/r2iwqgUHCB,还有我使用的regexp。在java中,it‘t work.If,有人可以解释为什么它不工作,或者甚至向我展示它是如何工作的,我将非常感激。
发布于 2013-06-20 01:57:01
你可以这样描述摩尔斯电码:
[.-]{1,5}(?> [.-]{1,5})*(?> [.-]{1,5}(?> [.-]{1,5})*)*摩尔斯字母表中的每个元素都有1到5个Dit或Dah。
每个字母由一个空格分隔
每个单词由三个空格隔开
发布于 2013-06-20 01:53:57
这可能是因为[+.|+\s|+-]是一个字符类,所以它可能只匹配单个字符。也许你想要的是[.\s\-]+。
发布于 2013-06-20 13:16:13
出于好奇,为什么不直接验证包含已知序列的字符串呢?
只有当字符串包含有效的摩尔斯电码字母、标点符号或数字时,此正则表达式才会匹配。字符串开头或结尾的任何空格都会被自动忽略。并且表达式要求字符之间有1个或3个空格。
^\s*(?:\s*(?:\.-|-\.\.\.|-\.-\.|-\.\.|\.|\.\.-\.|--\.|\.\.\.\.|\.\.|\.---|-\.-|\.-\.\.|--|-\.|---|\.--\.|--\.-|\.-\.|\.\.\.|-|\.\.-|\.\.\.-|\.--|-\.\.-|-\.--|--\.\.|-----|\.----|\.\.---|\.\.\.--|\.\.\.\.-|\.\.\.\.\.|-\.\.\.\.|--\.\.\.|---\.\.|----\.|\.-\.-\.-|--\.\.--|\.\.--\.\.|\.----\.|-\.-\.--|-\.\.-\.|-\.--\.|-\.--\.-|\.-\.\.\.|---\.\.\.|-\.-\.-\.|-\.\.\.-|\.-\.-\.|-\.\.\.\.-|\.\.--\.-|\.-\.\.-\.|\.\.\.-\.\.-|\.--\.-\.)(?=\s|\s{3}|\s*$))+\s*$
Java代码示例
代码
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
public static void main(String[] asd){
String sourcestring = " .... . .-.. .-.. --- .-- --- .-. .-.. -.. ";
Pattern re = Pattern.compile("^\\s*((?:\\s*?(?:\\.-|-\\.\\.\\.|-\\.-\\.|-\\.\\.|\\.|\\.\\.-\\.|--\\.|\\.\\.\\.\\.|\\.\\.|\\.---|-\\.-|\\.-\\.\\.|--|-\\.|---|\\.--\\.|--\\.-|\\.-\\.|\\.\\.\\.|-|\\.\\.-|\\.\\.\\.-|\\.--|-\\.\\.-|-\\.--|--\\.\\.|-----|\\.----|\\.\\.---|\\.\\.\\.--|\\.\\.\\.\\.-|\\.\\.\\.\\.\\.|-\\.\\.\\.\\.|--\\.\\.\\.|---\\.\\.|----\\.|\\.-\\.-\\.-|--\\.\\.--|\\.\\.--\\.\\.|\\.----\\.|-\\.-\\.--|-\\.\\.-\\.|-\\.--\\.|-\\.--\\.-|\\.-\\.\\.\\.|---\\.\\.\\.|-\\.-\\.-\\.|-\\.\\.\\.-|\\.-\\.-\\.|-\\.\\.\\.\\.-|\\.\\.--\\.-|\\.-\\.\\.-\\.|\\.\\.\\.-\\.\\.-|\\.--\\.-\\.)(?=\\s|\\s{3}|\\s*$))+)\\s*$",Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = re.matcher(sourcestring);
if(m.find()){
for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
System.out.println( "[" + groupIdx + "] = " + m.group(groupIdx));
}
}
}
}输出
捕获组0获取整个匹配的输入字符串。第一组得到修剪后的句子。
[0] => .... . .-.. .-.. --- .-- --- .-. .-.. -..
[1] => .... . .-.. .-.. --- .-- --- .-. .-.. -..如果字符串无效,正则表达式将不返回任何内容(也称为false)。
https://stackoverflow.com/questions/17197887
复制相似问题