问题
I'm trying to catch symbols in a dart Regexp. My regexp looks like this:
  RegExp containsSymbolRegExp = RegExp(r"[-!$%^&*()_+|~=`{}\[\]:;'<>?,.\/]");
However, I also need to make it catch the symbol " I can't stick " in there though, since it messes with the string. Any ideas how to do this? Thanks.
edit: jamesdlin's answer works great for dart. But it doesn't work for my flutter app, so I'm thinking it has something to do with flutter. Here's the code I'm applying this to:
TextEditingController _passwordController = TextEditingController();
bool containsSymbol;
RegExp containsSymbolRegExp = RegExp(r"[-!$%^&*()_+|~=`{}#@\[\]:;'<>?,.\/"
      '"'
      "]");
void _handleChange(text) {
    setState(() {
        containsSymbol = containsSymbolRegExp.hasMatch(_passwordController.text);
    });
    print(containsSymbol); // always prints false for " ' \ but works for all other symbols
  }
Widget _textField(controller, labelText) {
  return Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: <Widget>[
      Text(labelText, style: TextStyle(fontSize: 11)),
      Container(
        width: MediaQuery.of(context).size.width * 0.9,
        height: 35,
        child: TextField(
          onChanged: _handleChange,
          style: TextStyle(fontSize: 20),
          keyboardType: TextInputType.text,
          controller: _passwordController,
          cursorColor: Colors.grey,
          decoration: InputDecoration(
              focusedBorder: UnderlineInputBorder(
                  borderSide: BorderSide(color: Colors.grey))),
        ),
      ),
    ],
  );
}
回答1:
You could take advantage of string concatenation of adjacent string literals and either use a single-quoted string or use a non-raw string with " escaped:
RegExp(
  r"[-!$%^&*()_+|~=`{}\[\]:;'<>?,.\/"
  '"'
  "]");
Alternatively you always could use a non-raw string with more escapes:
RegExp(
  "[-!\$%^&*()_+|~=`{}\\[\\]:;'<>?,.\\/\"]");
although that's messier.
回答2:
To answer to the edited part of your question being that it worked in Dart but not in Flutter...
It is because apostrophes/quotation marks from TextField values in Flutter are right quotation marks and therefore come in different Unicode.
For apostrophes, it's U+2019 (’) instead of U+0027 (')
For quotation marks, U+201D (”) instead of U+0022 (")
The Regex you were trying with is not capturing for such characters. Therefore, you just need to add those into your Regex.
RegExp containsSymbolRegExp = RegExp(
   r"[-!$%^&*()_+|~=`{}#@\[\]:;'’<>?,.\/"
   '"”'
   "]");
Tip: Debug! :) I can already see some part of the value looking funny the moment it hits the breakpoint of where the value was about to be evaluated.
来源:https://stackoverflow.com/questions/58141263/escape-regexp-in-dart