From 40bacbcd7ce3247cf778e52e9367e2d675e0f153 Mon Sep 17 00:00:00 2001 From: dana Date: Wed, 9 Aug 2017 05:53:35 -0500 Subject: Add -x/--line-regexp (#520) add -x/--line-regexp flag --- src/args.rs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'src/args.rs') diff --git a/src/args.rs b/src/args.rs index fb37c715..ff636d17 100644 --- a/src/args.rs +++ b/src/args.rs @@ -427,7 +427,8 @@ impl<'a> ArgMatches<'a> { /// /// Note that if -F/--fixed-strings is set, then all patterns will be /// escaped. Similarly, if -w/--word-regexp is set, then all patterns - /// are surrounded by `\b`. + /// are surrounded by `\b`, and if -x/--line-regexp is set, then all + /// patterns are surrounded by `^...$`. /// /// If any pattern is invalid UTF-8, then an error is returned. fn patterns(&self) -> Result> { @@ -470,7 +471,7 @@ impl<'a> ArgMatches<'a> { Ok(pats) } - /// Converts an OsStr pattern to a String pattern, including word + /// Converts an OsStr pattern to a String pattern, including line/word /// boundaries or escapes if applicable. /// /// If the pattern is not valid UTF-8, then an error is returned. @@ -479,10 +480,12 @@ impl<'a> ArgMatches<'a> { Ok(self.str_pattern(s)) } - /// Converts a &str pattern to a String pattern, including word + /// Converts a &str pattern to a String pattern, including line/word /// boundaries or escapes if applicable. fn str_pattern(&self, pat: &str) -> String { - let s = self.word_pattern(self.literal_pattern(pat.to_string())); + let litpat = self.literal_pattern(pat.to_string()); + let s = self.line_pattern(self.word_pattern(litpat)); + if s.is_empty() { self.empty_pattern() } else { @@ -511,6 +514,16 @@ impl<'a> ArgMatches<'a> { } } + /// Returns the given pattern as a line pattern if the -x/--line-regexp + /// flag is set. Otherwise, the pattern is returned unchanged. + fn line_pattern(&self, pat: String) -> String { + if self.is_present("line-regexp") { + format!(r"^(?:{})$", pat) + } else { + pat + } + } + /// Empty pattern returns a pattern that is guaranteed to produce an empty /// regular expression that is valid in any position. fn empty_pattern(&self) -> String { -- cgit v1.2.3