Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态识别模式:无正则表达式_Java_Parsing_Pattern Matching - Fatal编程技术网

Java 动态识别模式:无正则表达式

Java 动态识别模式:无正则表达式,java,parsing,pattern-matching,Java,Parsing,Pattern Matching,java中是否有任何方法可以动态识别句子格式,并找到与此格式匹配的另一个单词/词组 例如: workExperience: some text educationalQualification: some text 假设worExperience是文本文件的第一行。java程序应该扫描这一行并提取句子格式为xY,其中x是全小写单词,Y是首字母大写的单词。然后使用此选项,它应该匹配教育资格。 这必须是动态的,因为格式可能因文件而异。例如,另一个文件的第一行可能是工作经验 现在我们所做的是创建一

java中是否有任何方法可以动态识别句子格式,并找到与此格式匹配的另一个单词/词组

例如:

workExperience:
some text

educationalQualification:
some text
假设worExperience是文本文件的第一行。java程序应该扫描这一行并提取句子格式为
xY
,其中
x
是全小写单词,
Y
是首字母大写的单词。然后使用此选项,它应该匹配
教育资格
。 这必须是动态的,因为格式可能因文件而异。例如,另一个文件的第一行可能是
工作经验

现在我们所做的是创建一组可能的格式模板,并尝试使用此模板匹配它们。还有别的办法吗

在这里,我不是在寻找文本匹配。我想确定第一行的格式,即
workExperience
,并想匹配文件中属于此格式的所有其他词组,在本例中,它应该找到
educationalQualification

可能的格式可能是

Work Experience
workExperience
WORK EXPERIENCE
work Experience etc

假设您想匹配
工作经验的任何排列:
您可以尝试将行小写并删除所有空格,即

"work experience:".toLowerCase().replaceAll(" ","").equals("workexperience:");
"work experience:".toLowerCase().replaceAll(" ","").equals("workexperience:");   
"Work Experience:".toLowerCase().replaceAll(" ","").equals("workexperience:");   
"workExperience:".toLowerCase().replaceAll(" ","").equals("workexperience:");   
"workexperience:".toLowerCase().replaceAll(" ","").equals("workexperience:");   
" work   experience   :".toLowerCase().replaceAll(" ","").equals("workexperience:");   
这些都会成为现实

或者,使用
equalsIgnoreCase()

编辑:切换参数将使其更具可读性:

"workexperience:".equalsIgnoreCase( "work experience:".replaceAll(" ",""));
"workexperience:".equalsIgnoreCase( "workExperience:".replaceAll(" ",""));
"workexperience:".equalsIgnoreCase( "Work Experience:".replaceAll(" ",""));
"workexperience:".equalsIgnoreCase( "WorkExperience:".replaceAll(" ",""));
"workexperience:".equalsIgnoreCase( "   work experience    :".replaceAll(" ",""));

如果您只关心小写/大写字母和空格的组合,那么可以基于第一行输入动态地构建regexp。你可以好好利用番石榴

大概是这样的:

String getPattern(String fromString) {
    Map<CharMatcher, String> charToRegex = Maps.newHashMap();
    charToRegex.put(CharMatcher.JAVA_LOWER_CASE, "[a-z]");
    charToRegex.put(CharMatcher.JAVA_UPPER_CASE, "[A-Z]");
    charToRegex.put(CharMatcher.WHITESPACE, "\\s");

    StringBuilder pattern = new StringBuilder();
    String lastRegexPart = "";

    for (int i = 0; i < fromString.length(); i++) {
        for (CharMatcher matcher : charToRegex.keySet()) {
            if (matcher.apply(fromString.charAt(i))) {
                String regexPart = charToRegex.get(matcher);
                if (lastRegexPart.equals(regexPart)) {
                    if (pattern.lastIndexOf("+") != pattern.length() - 1) {
                        pattern.append("+");
                    }
                } else {
                    pattern.append(regexPart);
                    lastRegexPart = regexPart;
                }
            }
        }
    }
    return pattern.toString();
}

即使您的要求有点复杂,我认为您可以微调此算法以满足您的需要。

所以您不想使用正则表达式,为什么?顺便说一句,对于模式匹配问题,发布一些输入和预期输出的示例会很有帮助。如果您描述了您希望支持的可能格式以及您希望算法在不同输入上的工作方式,这将很有帮助。这听起来仍然像regex usecase。。。。。
String getPattern(String fromString) {
    Map<CharMatcher, String> charToRegex = Maps.newHashMap();
    charToRegex.put(CharMatcher.JAVA_LOWER_CASE, "[a-z]");
    charToRegex.put(CharMatcher.JAVA_UPPER_CASE, "[A-Z]");
    charToRegex.put(CharMatcher.WHITESPACE, "\\s");

    StringBuilder pattern = new StringBuilder();
    String lastRegexPart = "";

    for (int i = 0; i < fromString.length(); i++) {
        for (CharMatcher matcher : charToRegex.keySet()) {
            if (matcher.apply(fromString.charAt(i))) {
                String regexPart = charToRegex.get(matcher);
                if (lastRegexPart.equals(regexPart)) {
                    if (pattern.lastIndexOf("+") != pattern.length() - 1) {
                        pattern.append("+");
                    }
                } else {
                    pattern.append(regexPart);
                    lastRegexPart = regexPart;
                }
            }
        }
    }
    return pattern.toString();
}
getPattern("workExperience"); // returns [a-z]+[A-Z][a-z]+
getPattern("Work Experience"); // returns [A-Z][a-z]+\s[A-Z][a-z]+