質問
私はJavaを利用してregexes Java1.6(特に解析を数値出力とのできない見された厳密な定義 \b
("単語の境界").あったかと -12
する"整数型言葉"(合 \b\-?\d+\b
ができると考えることはできません。さんに感謝して知らの方をマッチングスペース区切りです。
例:
Pattern pattern = Pattern.compile("\\s*\\b\\-?\\d+\\s*");
String plus = " 12 ";
System.out.println(""+pattern.matcher(plus).matches());
String minus = " -12 ";
System.out.println(""+pattern.matcher(minus).matches());
pattern = Pattern.compile("\\s*\\-?\\d+\\s*");
System.out.println(""+pattern.matcher(minus).matches());
この戻り値:
true
false
true
解決
のワード境界が、ほとんどの正規表現の方言では、\w
及び\W
(非ワードチャー)との間の位置で、または文字列の先頭または末尾には、単語文字([0-9A-Za-z_]
)で開始または終了(それぞれ)場合ます。
ですから、文字列"-12"
で、それは1の前に合っているでしょうか。2.後にダッシュが単語文字ではありません。
他のヒント
単語境界が一つのポジション:
- 前の最初の文字の文字列の場合、最初の文字という言葉があります。
- 最後の文字の文字列が最後の文字という言葉があります。
- 二文字の文字列があり、一つの言葉の文字のない言葉を文字です。
単語の文字はアルファ-数値;マイナス記号はないです。から Regexのチュートリアル.
ワード境界は単語文字が先行一つ、または1つが先行する単語文字としない続い続いていないいずれかの位置である。
私が実際にどのような\b
スタイルの正規表現の境界線について話<のhref = "https://stackoverflow.com/questions/4213800/is-there-something-like-a-counter-variable-in-regular-expressionここを-replace / 4214173#4214173" >。
ショートストーリーは、彼らは条件付きののだということです。彼らの行動は、彼らが隣にいるかに依存します。
# same as using a \b before:
(?(?=\w) (?<!\w) | (?<!\W) )
# same as using a \b after:
(?(?<=\w) (?!\w) | (?!\W) )
時々、それはあなたが望むものではありません。精緻化のための私の他の回答を参照してください。
境界条件のドキュメントをチェックアウト:
http://java.sun.com/docs /books/tutorial/essential/regex/bounds.htmlする
このサンプルをチェックしてください:
public static void main(final String[] args)
{
String x = "I found the value -12 in my string.";
System.err.println(Arrays.toString(x.split("\\b-?\\d+\\b")));
}
あなたはそれをプリントアウトすると、出力はこのことがわかります:
[Iが値を発見した - 。、私の文字列で]
これは、ことを意味し、「 - 」それは単語の文字と考えていないので、文字が単語の境界上にあるものとしてピックアップされていません。 @brianaryはちょっとパンチに私を打つように見えるので、彼は、アップ票を取得します。
.NET
、C++
、C#
、およびC
のような言葉のテキストを検索するときに私はさらに悪化の問題に遭遇しました。あなたが正規表現を記述することは困難である言語の何かに名前を付けるよりも、コンピュータプログラマがよく知っていると思うだろう。
\w
は「単語文字」の略です。それは、常にASCII文字の[A-Za-z0-9_]
にマッチします。アンダースコアと数字を含めることに注意してください(ただし、ダッシュではありません!)。 Unicodeをサポートするほとんどの味で、\w
は、他のスクリプトから多くの文字が含まれています。文字が実際に含まれているかについての矛盾がたくさんあります。アルファベットスクリプトや表意文字から文字と数字は一般的に含まれています。アンダースコアと数字が含まれたりしてもしなくてもよいではない数値記号以外のコネクタ句読点。 XMLスキーマとXPathにも\w
内のすべてのシンボルを含みます。しかし、Javaの、JavaScript、およびPCREマッチ\w
とASCII文字のみます。
どのC++
、C#
または.NET
ためのJavaベースの正規表現の検索は(あなたが期間とプラスを逃れるために覚えている場合でも)\b
によりネジ止めされている理由です。
注:私は誰かが、文の末尾にピリオドの後にスペースを入れていないときのようなテキストでのミス、について何をすべきかわかりません。私はそれのために許可され、私はそれが必ずしも行うには正しいことだということはよく分からない。
あなたがそれらの奇妙な名前の言語のテキストを検索している場合は、とにかく、Javaで、あなたが空白や句読点指定子の前と後で\b
を交換する必要があります。たとえばます:
public static String grep(String regexp, String multiLineStringToSearch) {
String result = "";
String[] lines = multiLineStringToSearch.split("\\n");
Pattern pattern = Pattern.compile(regexp);
for (String line : lines) {
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
result = result + "\n" + line;
}
}
return result.trim();
}
次に、あなたのテストまたはメイン機能でます:
String beforeWord = "(\\s|\\.|\\,|\\!|\\?|\\(|\\)|\\'|\\\"|^)";
String afterWord = "(\\s|\\.|\\,|\\!|\\?|\\(|\\)|\\'|\\\"|$)";
text = "Programming in C, (C++) C#, Java, and .NET.";
System.out.println("text="+text);
// Here is where Java word boundaries do not work correctly on "cutesy" computer language names.
System.out.println("Bad word boundary can't find because of Java: grep with word boundary for .NET="+ grep("\\b\\.NET\\b", text));
System.out.println("Should find: grep exactly for .NET="+ grep(beforeWord+"\\.NET"+afterWord, text));
System.out.println("Bad word boundary can't find because of Java: grep with word boundary for C#="+ grep("\\bC#\\b", text));
System.out.println("Should find: grep exactly for C#="+ grep("C#"+afterWord, text));
System.out.println("Bad word boundary can't find because of Java:grep with word boundary for C++="+ grep("\\bC\\+\\+\\b", text));
System.out.println("Should find: grep exactly for C++="+ grep(beforeWord+"C\\+\\+"+afterWord, text));
System.out.println("Should find: grep with word boundary for Java="+ grep("\\bJava\\b", text));
System.out.println("Should find: grep for case-insensitive java="+ grep("?i)\\bjava\\b", text));
System.out.println("Should find: grep with word boundary for C="+ grep("\\bC\\b", text)); // Works Ok for this example, but see below
// Because of the stupid too-short cutsey name, searches find stuff it shouldn't.
text = "Worked on C&O (Chesapeake and Ohio) Canal when I was younger; more recently developed in Lisp.";
System.out.println("text="+text);
System.out.println("Bad word boundary because of C name: grep with word boundary for C="+ grep("\\bC\\b", text));
System.out.println("Should be blank: grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));
// Make sure the first and last cases work OK.
text = "C is a language that should have been named differently.";
System.out.println("text="+text);
System.out.println("grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));
text = "One language that should have been named differently is C";
System.out.println("text="+text);
System.out.println("grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));
//Make sure we don't get false positives
text = "The letter 'c' can be hard as in Cat, or soft as in Cindy. Computer languages should not require disambiguation (e.g. Ruby, Python vs. Fortran, Hadoop)";
System.out.println("text="+text);
System.out.println("Should be blank: grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));
P.S。 http://regexpal.com/ の誰せずに正規表現の世界は非常に悲惨なことでしょう!
に感謝コースの学習の正規表現がかりにこだわったのmetacharacterる \b
.私は確かな理解とその意味からというのは"そうで"統計処理を可能にした。その後試みを使用 のwebサイト, 私は見出しのピンク色の縦のダッシュのセンターでは、全ての言葉の言葉です。ログインしてくだその意味ました。について正確に word(\w
)-境界.
私は単に非常に理解します。ロジックでついての検討が必要であるから答えなのです。
についてご説明したいと思い アラン-ムーアの回答
単語境界での地位のいずれかの前の単語の文字になられている、またはその後の単語の文字は前ます。
ることもあって、文字列"これは a catた awesome"ことが決まっていをお願いするものでありますoccurance(s)文字の'a'の場合のみこの手紙にあるもの "Boundryの言葉" すなわちこの手紙 a
内部'cat'べきではない交換にも対応しています。
思を行う正規表現( Python として
re.sub("\ba","e", myString.strip())
//交換 a
と e
で出力する
この e
cat e
ndっ e
wesome
この問題は、そのよ -
ではない単語の文字です。これにより、単語の境界が一致した後の -
, にはなりませんより捕捉する方法です。単語境界戦前の初と最後の言葉の文字の文字列などの場合では単語の文字や単語文字とが逆行するものとなっている。また、単語の境界は、幅ゼロの戦いました。
このインタビューを受けたことがあ
(?:(?:^|\s)-?)\d+\b
これに合わせ番号から空白文字およびオプションのダッシュ終単語境界線。また、マッチ番号の先頭の文字列になります。
私はそれが最後のマッチや文字列の先頭または末尾の境界(すなわち文字以下)だと思います。
あなただけの単語文字が\\b(\\w+)+\\b
含む単語との完全な一致を意味([a-zA-Z0-9])
を使用する場合
例えば、あなたのケースで正規表現の初めに\\b
を設定すること(スペースで)-12
を受け付けますが、再び、それは(スペースなし)-12
を受け付けません。
参考のために私の言葉をサポートします。 oracle.com/javase/tutorial/essential/regex/bounds.htmlする