出于好奇,为什么不验证字符串是否包含已知序列?
仅当字符串包含有效的摩尔斯电码字母、标点符号或数字时,此正则表达式才会匹配。字符串开头或结尾的任何空格都会被自动忽略。并且该表达式要求字符之间有 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 获取整个匹配的输入字符串。第 1 组得到修剪后的句子。
[0] => .... . .-.. .-.. --- .-- --- .-. .-.. -..
[1] => .... . .-.. .-.. --- .-- --- .-. .-.. -..
如果字符串无效,正则表达式将不返回任何内容(也称为 false)。