我正在尝试将正则表达式与我从网站上获得的教科书定义相匹配。 定义总是带有一个新行后跟定义的单词。例如:
Zither
Definition: An instrument of music used in Austria and Germany It has from thirty to forty wires strung across a shallow sounding board which lies horizontally on a table before the performer who uses both hands in playing on it Not to be confounded with the old lute shaped cittern or cithern
在我尝试获取单词(在本例中为“Zither”)时,我不断获取换行符。
我试了^(\w+)\s
和^(\S+)\s
没有太多运气。我想也许^(\S+)$
可能有用,但似乎根本没有成功匹配这个词。我一直在测试rubular,http://rubular.com/r/LPEHCnS0ri;尽管Java不这样做,但它似乎成功地匹配了我想要的所有尝试。
这是我的代码段
String str = ...; //Here the string is assigned a word and definition taken from the internet like given in the example above.
Pattern rgx = Pattern.compile("^(\\S+)$");
Matcher mtch = rgx.matcher(str);
if (mtch.find()) {
String result = mtch.group();
terms.add(new SearchTerm(result, System.nanoTime()));
}
通过调整结果字符串很容易解决这个问题,但如果我已经使用了正则表达式,那么这似乎是不必要的。
非常感谢所有帮助。提前谢谢!
答案 0 :(得分:8)
尝试使用Pattern.MULTILINE选项
Pattern rgx = Pattern.compile("^(\\S+)$", Pattern.MULTILINE);
这会导致正则表达式识别字符串中的行分隔符,否则^
和$
只匹配字符串的开头和结尾。
虽然这种模式没有区别,但Matcher.group()
方法返回整个匹配,而Matcher.group(int)
方法根据您的数字返回特定捕获组(...)
的匹配项指定。您的模式指定了一个您想要捕获的捕获组。如果您在模式中包含了\s
,那么Matcher.group()
会在返回值中包含该空格。
答案 1 :(得分:2)
使用正则表达式,第一个组始终是完整匹配的字符串。在您的情况下,您需要组1,而不是组0。
因此,将mtch.group()
更改为mtch.group(1)
应该可以解决问题:
String str = ...; //Here the string is assigned a word and definition taken from the internet like given in the example above.
Pattern rgx = Pattern.compile("^(\\w+)\s");
Matcher mtch = rgx.matcher(str);
if (mtch.find()) {
String result = mtch.group(1);
terms.add(new SearchTerm(result, System.nanoTime()));
}
答案 2 :(得分:1)
只需替换:
String result = mtch.group();
人:
String result = mtch.group(1);
这会将您的输出限制为capturing group的内容(例如(\\w+)
)。
答案 3 :(得分:1)
迟到的回复,但是如果您没有使用模式和匹配器,则可以在正则表达式字符串中使用DOTALL
的替代
(?s)[Your Expression]
基本上(?s)
也告诉dot匹配所有字符,包括换行符
详细信息:http://www.vogella.com/tutorials/JavaRegularExpressions/article.html
答案 4 :(得分:0)
尝试下一个:
/* The regex pattern: ^(\w+)\r?\n(.*)$ */
private static final REGEX_PATTERN =
Pattern.compile("^(\\w+)\\r?\\n(.*)$");
public static void main(String[] args) {
String input = "Zither\n Definition: An instrument of music";
System.out.println(
REGEX_PATTERN.matcher(input).matches()
); // prints "true"
System.out.println(
REGEX_PATTERN.matcher(input).replaceFirst("$1 = $2")
); // prints "Zither = Definition: An instrument of music"
System.out.println(
REGEX_PATTERN.matcher(input).replaceFirst("$1")
); // prints "Zither"
}