我正在尝试测试莫尔斯电码是否合法。
public static boolean isMorseCode( String code ){
return code.trim().matches("[+.|+\s|+-]");
}
莫尔斯代码行可以以.
(称为Dit)和-
(称为Dah)开头。它可以在行中有空格。
在两个特定代码之间有1个空格,例如.- -.
,在这种情况下,仅由一个空格分隔的代码之和就是一个单词。但它也可以有3个空格,然后一个新单词开始。我正在使用trim来排除在行的开头和结尾可能有空格的事实。
这是一个让它更清晰的例子。
我们使用“Hello World”进行解释。白色空间通过张贴来消除,所以看看http://www.rubular.com/r/r2iwqgUHCB还有我使用的正则表达式。在java中它不起作用。如果有人能够解释它为什么不起作用,甚至告诉我它是如何工作的,我将非常感激。
答案 0 :(得分:2)
你可以用这个描述摩尔斯电码:
[.-]{1,5}(?> [.-]{1,5})*(?> [.-]{1,5}(?> [.-]{1,5})*)*
莫尔斯字母的每个元素都有1或5个Dit或Dah。
每个字母用一个空格分隔
每个单词用三个空格分隔
答案 1 :(得分:1)
可能是因为[+.|+\s|+-]
是一个字符类,所以它可能只匹配一个字符。也许你想要的是[.\s\-]+
。
答案 2 :(得分:1)
出于好奇,为什么不只是验证字符串是否包含已知序列?
如果字符串包含有效的莫尔斯代码字母,标点符号或数字,则此正则表达式仅匹配匹配。字符串开头或结尾的任何空格都会被自动忽略。表达式要求字符之间有1或3个空格。
^\s*(?:\s*(?:\.-|-\.\.\.|-\.-\.|-\.\.|\.|\.\.-\.|--\.|\.\.\.\.|\.\.|\.---|-\.-|\.-\.\.|--|-\.|---|\.--\.|--\.-|\.-\.|\.\.\.|-|\.\.-|\.\.\.-|\.--|-\.\.-|-\.--|--\.\.|-----|\.----|\.\.---|\.\.\.--|\.\.\.\.-|\.\.\.\.\.|-\.\.\.\.|--\.\.\.|---\.\.|----\.|\.-\.-\.-|--\.\.--|\.\.--\.\.|\.----\.|-\.-\.--|-\.\.-\.|-\.--\.|-\.--\.-|\.-\.\.\.|---\.\.\.|-\.-\.-\.|-\.\.\.-|\.-\.-\.|-\.\.\.\.-|\.\.--\.-|\.-\.\.-\.|\.\.\.-\.\.-|\.--\.-\.)(?=\s|\s{3}|\s*$))+\s*$
<强>代码强>
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获取整个匹配的输入字符串。第1组获得修剪后的句子。
[0] => .... . .-.. .-.. --- .-- --- .-. .-.. -..
[1] => .... . .-.. .-.. --- .-- --- .-. .-.. -..
如果字符串无效,正则表达式将不返回任何内容(也称为false)。