-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix not escaping special characters in search pattern #5938
Changes from 1 commit
2f68520
5c2925d
89c72c0
6f39cbc
266bfc8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,6 +18,9 @@ | |
|
||
public class SearchQuery implements SearchMatcher { | ||
|
||
// regexp pattern for escaping special characters in javascript regex | ||
public static final String JAVASCRIPT_ESCAPED_CHARS_PATTERN = "[\\.\\*\\+\\?\\^\\$\\{\\}\\(\\)\\|\\[\\]\\\\/]"; | ||
|
||
private final String query; | ||
private final boolean caseSensitive; | ||
private final boolean regularExpression; | ||
|
@@ -124,6 +127,18 @@ public List<String> getSearchWords() { | |
|
||
// Returns a regular expression pattern in the form (w1)|(w2)| ... wi are escaped if no regular expression search is enabled | ||
public Optional<Pattern> getPatternForWords() { | ||
return joinWordsToPattern(false); | ||
} | ||
|
||
// Returns a regular expression pattern in the form (w1)|(w2)| ... wi are escaped for javascript if no regular expression search is enabled | ||
public Optional<Pattern> getJsPatternForWords() { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. IMHO, although "Js" is quite obvious, I would reword that to getJavaScriptPatternForWords, since you are creating a new Method just for the sole purpose to make its use more obvious in it's name. So why not go all the way? |
||
return joinWordsToPattern(true); | ||
} | ||
|
||
/* Returns a regular expression pattern in the form (w1)|(w2)| ... wi are escaped if no regular expression search is enabled | ||
* @param escapeSpecialCharsForJS whether to escape characters in wi for javascript regexp (escaping all special characters) or for java (using \Q and \E) | ||
*/ | ||
private Optional<Pattern> joinWordsToPattern(boolean escapeSpecialCharsForJS) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Better is to use an enum here, eg.. EscapMode, with java and javascript as values: |
||
List<String> words = getSearchWords(); | ||
|
||
if ((words == null) || words.isEmpty() || words.get(0).isEmpty()) { | ||
|
@@ -133,7 +148,7 @@ public Optional<Pattern> getPatternForWords() { | |
// compile the words to a regular expression in the form (w1)|(w2)|(w3) | ||
StringJoiner joiner = new StringJoiner(")|(", "(", ")"); | ||
for (String word : words) { | ||
joiner.add(regularExpression ? word : Pattern.quote(word)); | ||
joiner.add(regularExpression ? word : (escapeSpecialCharsForJS ? word.replaceAll(JAVASCRIPT_ESCAPED_CHARS_PATTERN, "\\\\$0") : Pattern.quote(word))); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please extract this to a regular if-else, it's easier to understand on the first look than this chained conditions |
||
} | ||
String searchPattern = joiner.toString(); | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can use Pattern.compile to gain some performace improvements here