Fix parsing: re-allow underscore in long names. (#141)

diff --git a/lib/src/parser.dart b/lib/src/parser.dart
index 8dafef9..cb15288 100644
--- a/lib/src/parser.dart
+++ b/lib/src/parser.dart
@@ -237,7 +237,7 @@
     var index = current.indexOf('=');
     var name = index == -1 ? current.substring(2) : current.substring(2, index);
     for (var i = 0; i != name.length; ++i) {
-      if (!_isLetterOrDigitOrHyphen(name.codeUnitAt(i))) return false;
+      if (!_isLetterDigitHyphenOrUnderscore(name.codeUnitAt(i))) return false;
     }
     var value = index == -1 ? null : current.substring(index + 1);
     if (value != null && (value.contains('\n') || value.contains('\r'))) {
@@ -338,5 +338,9 @@
     // Digits.
     (codeUnit >= 48 && codeUnit <= 57);
 
-bool _isLetterOrDigitOrHyphen(int codeUnit) =>
-    _isLetterOrDigit(codeUnit) || codeUnit == 45;
+bool _isLetterDigitHyphenOrUnderscore(int codeUnit) =>
+    _isLetterOrDigit(codeUnit) ||
+    // Hyphen.
+    codeUnit == 45 ||
+    // Underscore.
+    codeUnit == 95;
diff --git a/test/parse_test.dart b/test/parse_test.dart
index 9c87487..9639567 100644
--- a/test/parse_test.dart
+++ b/test/parse_test.dart
@@ -61,6 +61,15 @@
         expect(results['verbose'], isTrue);
         expect(results['Verbose'], isFalse);
       });
+
+      test('match letters, numbers, hyphens and underscores', () {
+        var parser = ArgParser();
+        var allCharacters =
+            'abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789';
+        parser.addFlag(allCharacters);
+        var results = parser.parse(['--$allCharacters']);
+        expect(results[allCharacters], isTrue);
+      });
     });
 
     group('flags negated with "no-"', () {