Require usage of fixed=TRUE
in regular expressions where appropriate
Source: R/fixed_regex_linter.R
fixed_regex_linter.Rd
Invoking a regular expression engine is overkill for cases when the search pattern only involves static patterns.
Arguments
- allow_unescaped
Logical, default
FALSE
. IfTRUE
, only patterns that require regex escapes (e.g."\\$"
or"[$]"
) will be linted. See examples.
Details
NB: for stringr
functions, that means wrapping the pattern in stringr::fixed()
.
NB: this linter is likely not able to distinguish every possible case when a fixed regular expression is preferable, rather it seeks to identify likely cases. It should never report false positives, however; please report false positives as an error.
See also
linters for a complete list of linters available in lintr.
Examples
# will produce lints
code_lines <- 'gsub("\\\\.", "", x)'
writeLines(code_lines)
#> gsub("\\.", "", x)
lint(
text = code_lines,
linters = fixed_regex_linter()
)
#> ::warning file=<text>,line=1,col=6::file=<text>,line=1,col=6,[fixed_regex_linter] This regular expression is static, i.e., its matches can be expressed as a fixed substring expression, which is faster to compute. Here, you can use "." with fixed = TRUE.
lint(
text = 'grepl("a[*]b", x)',
linters = fixed_regex_linter()
)
#> ::warning file=<text>,line=1,col=7::file=<text>,line=1,col=7,[fixed_regex_linter] This regular expression is static, i.e., its matches can be expressed as a fixed substring expression, which is faster to compute. Here, you can use "a*b" with fixed = TRUE.
lint(
text = 'grepl("a[*]b", x)',
linters = fixed_regex_linter(allow_unescaped = TRUE)
)
#> ::warning file=<text>,line=1,col=7::file=<text>,line=1,col=7,[fixed_regex_linter] This regular expression is static, i.e., its matches can be expressed as a fixed substring expression, which is faster to compute. Here, you can use "a*b" with fixed = TRUE.
code_lines <- 'stringr::str_subset(x, "\\\\$")'
writeLines(code_lines)
#> stringr::str_subset(x, "\\$")
lint(
text = code_lines,
linters = fixed_regex_linter()
)
#> ::warning file=<text>,line=1,col=24::file=<text>,line=1,col=24,[fixed_regex_linter] This regular expression is static, i.e., its matches can be expressed as a fixed substring expression, which is faster to compute. Here, you can use stringr::fixed("$") as the pattern.
lint(
text = 'grepl("Munich", address)',
linters = fixed_regex_linter()
)
#> ::warning file=<text>,line=1,col=7::file=<text>,line=1,col=7,[fixed_regex_linter] This regular expression is static, i.e., its matches can be expressed as a fixed substring expression, which is faster to compute. Here, you can use "Munich" with fixed = TRUE.
# okay
code_lines <- 'gsub("\\\\.", "", x, fixed = TRUE)'
writeLines(code_lines)
#> gsub("\\.", "", x, fixed = TRUE)
lint(
text = code_lines,
linters = fixed_regex_linter()
)
lint(
text = 'grepl("a*b", x, fixed = TRUE)',
linters = fixed_regex_linter()
)
lint(
text = 'stringr::str_subset(x, stringr::fixed("$"))',
linters = fixed_regex_linter()
)
lint(
text = 'grepl("Munich", address, fixed = TRUE)',
linters = fixed_regex_linter()
)
lint(
text = 'grepl("Munich", address)',
linters = fixed_regex_linter(allow_unescaped = TRUE)
)