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