PHPで正規表現を使用して文字列を文に分割する
例
function sentence_split($text) { $before_regexes = array('/(?:(?:[\'\"„][\.!?…][\'\"”]\s)|(?:[^\.]\s[A-Z]\.\s)|(?:\b(?:St|Gen|Hon|Prof|Dr|Mr|Ms|Mrs|[JS]r|Col|Maj|Brig|Sgt|Capt|Cmnd|Sen|Rev|Rep|Revd) \.\s)|(?:\b(?:St|Gen|Hon|Prof|Dr|Mr|Ms|Mrs|[JS]r|Col|Maj|Brig|Sgt|Capt|Cmnd|Sen|Rev|Rep|Revd)\.\s[A-Z]\.\s)|(?:\bApr\.\s)|(?:\bAug\.\s)|(?:\bBros\. \s)|(?:\bCo\.\s)|(?:\bCorp\.\s)|(?:\bDec\.\s)|(?:\bDist\.\s)|(?:\bFeb\.\s)|(?:\bInc\.\s)|(?:\bJan\.\s)|(?:\bJul\.\s)|(?:\bJun\.\s)|(?:\bMar\.\s)|(? :\bNov\.\s)|(?:\bOct\.\s)|(?:\bPh\.?D\.\s)|(?:\bSept?\.\s)|(?:\b\p{Lu}\.\p{Lu}\.\s)|(?:\b\p{Lu}\.\s\p{Lu}\.\s)|(?:\bcf\.\s)|(?:\be\.g\.\s)|(?:\besp \.\s)|(?:\bet\b\s\bal\.\s)|(?:\bvs\.\s)|(?:\p{Ps}[!?]+\p{Pe} ))\Z/su', '/(?:(?:[\.\s]\p{L}{1,2}\.\s))\Z/su', '/(?:(?:[\[\(]*\.\.\.[\]\)]* ))\Z/su', '/(?:(?:\b(?:pp|[Vv]iz|i\.?\s*e|[Vvol]|[Rr]col|maj|Lt|[Ff]ig|[Ff]igs|[Vv]iz|[Vv]ols|[Aa]pprox|[Ii]ncl|Pres|[Dd]ept|min|max|[Gg]ovt|lb|ft|c\.?\s *f|vs)\.\s))\Z/su', '/(?:(?:\b[Ee]tc\.\s))\Z/su', '/(?:(?:[\.!?…]+\p{Pe} )|(?:[\[\(]*…[\]\)]* ))\Z/su', '/(?:(?:\b\p{L}\.))\Z/su', '/(?:(?:\b\p{L}\.\s))\Z/su', '/(?:(?:\b[Ff]igs?\.\s)|(?:\b[nN]o\.\s))\Z/su', '/(?:(?:[\"”\']\s*))\Z/su', '/(?:(?:[\.!?…] [\x{00BB}\x{2019}\x{201D}\x{203A}\"\'\p{Pe}\x{0002}]*\s)|(?:\r?\n))\Z/su', '/(?:(?:[\.!?…] [\'\"\x{00BB}\x{2019}\x{201D}\x{203A}\p{Pe}\x{0002}]*))\Z/su', '/(?:(?:\s\p{L}[\.!?…]\s))\Z/su'); $after_regexes = array('/\A(?:)/su', '/\A(?:[\p{N}\p{Ll}])/su', '/\A(?:[^\p{Lu}])/su', '/\A(?:[^\p{Lu}]|I)/su', '/\A(?:[^p{Lu}])/su', '/\A(?:\p{Ll})/su', '/\A(?:\p{L}\.)/su', '/\A(?:\p{L}\.\s)/su', '/\A(?:\p{N})/su', '/\A(?:\s*\p{Ll})/su', '/\A(?:)/su', '/\A(?:\p{Lu}[^\p{Lu}])/su', '/\A(?:\p{Lu}\p{Ll})/su'); $is_sentence_boundary = array(false, false, false, false, false, false, false, false, false, false, true, true, true); $count = 13; $sentences = array(); $sentence = ''; $before = ''; $after = substr($text, 0, 10); $text = substr($text, 10); while($text != '') { for($i = 0; $i < $count; $i++) { if(preg_match($before_regexes[$i], $before) && preg_match($after_regexes[$i], $after)) { if($is_sentence_boundary[$i]) { array_push($sentences, $sentence); $sentence = ''; } break; } } $first_from_text = $text[0]; $text = substr($text, 1); $first_from_after = $after[0]; $after = substr($after, 1); $before .= $first_from_after; $sentence .= $first_from_after; $after .= $first_from_text; } if($sentence != '' && $after != '') { array_push($sentences, $sentence.$after); } return $sentences; } $text = "Hello there, hello from Tokyo, Japan, Universe, Earth."; print_r(sentence_split($text));
出力
これにより、次の出力が生成されます-
Array ( [0] => Hello there, hello from Tokyo, Japan, Universe, Earth. )
テキストは徐々に繰り返されます。どの時点でも、テキストデータの現在のチャンクには2つの異なる部分があります。この場合、一部は文の境界の前に発生する部分文字列の候補になります。
他の部分は、文の境界の後に来る部分文字列の候補です。最初の20個の正規表現ペアが位置を検出します。文の境界が特定されていない場合、その新しい文を保存せずに前後がインクリメントされます。
一致するペアがない場合は、最後の3ペアとの一致が試行され、文の境界が検出されます。
-
文字列をC#の文字列配列の要素に分割するにはどうすればよいですか?
分割する文字列を設定します。 string str = "Hello World!"; split()メソッドを使用して、文字列を個別の要素に分割します。 string[] res = str.Split(' '); 以下は、文字列をC#の文字列配列の要素に分割するための完全なコードです。 例 using System; class Demo { static void Main() { string str = "Hello World!"; &nbs
-
C#正規表現を使用して空白を削除する
次の文字列str1から空白を削除したいとします。 string str1 = "Brad Pitt"; 次に、Regex Replaceを使用して、空白を空に置き換えます。ここでは、System.Text.RegularExpressionsを使用しました。 string str2 = System.Text.RegularExpressions.Regex.Replace(str1, @"\s+", ""); 完全な例を見てみましょう。 例 using System; using System.Text.RegularExpre