正規表現 Part9at TECH
正規表現 Part9 - 暇つぶし2ch688:デフォルトの名無しさん
12/03/16 23:11:23.76
>>685
""で囲んだ文字列は変数展開が有効になってる
抑制したいときは '' を使う(もしくは`)

[System.Text.RegularExpressions.Regex]::Replace($v, '^会場\[(.+)\]$','$1')

ちゅーか、$v -replace '^会場\[(.+)\]$','$1' でええやん
もしくは[Regex]::Replace($v, '^会場\[(.+)\]$','$1')


689:デフォルトの名無しさん
12/03/20 22:21:48.94
<que name="" mail="" vpos="-45400">/publish lv80605616_t2B_SHD_7@s35841 /content/20120319/lv80605616_214226439000_1_8370f8.f4v</que>
この文字列から

/content/20120319/lv80605616_214226439000_1_8370f8.f4v
の部分を抜き出すにはどうすればいい?

数字とかは毎回変わるんだけど

690:デフォルトの名無しさん
12/03/20 23:41:40.87
que.innerHTMLで/publish lv8.....f4v が取れるから後は好きなようにする

691:デフォルトの名無しさん
12/03/20 23:45:01.69
>>689
>>660

変わらないところはべた書きして「毎回変わる」ところは.+?にでもしとけ
/<que.+?(\/content\/.+?f4v\/)<\/que>/

692:デフォルトの名無しさん
12/03/21 07:11:36.55
>>691
それだと可変の文字列内にたまたまf4vの文字列が出てきたらNG
.+で最長マッチにしておくか可変の文字列内に記号(.)が出てこない仕様ならば
/<que.+?(\/content\/.+?\.f4v\/)<\/que>/
の方がよさそう

693:デフォルトの名無しさん
12/03/21 07:38:17.77
できました

694:デフォルトの名無しさん
12/03/21 12:53:29.40
わざわざqueとか調べなくても/contentから<までをとればいいんでないの

695:デフォルトの名無しさん
12/03/24 08:11:28.17
Objective-CのNSRegularExpressionで、
行頭の半角スペース列を置換しようとして@"^ +"と書いたのですが、文字列の最初しか行頭と認識してくれないらしく、
複数行にまたがる文字列の各行頭のスペースが置換できないので、改行文字に続く次のスペースも検出しようとして
@"^ +|\\n +"
と書くと、改行文字も含めて置換してしまうため、マッチ部分をキャプチャする()を使って
@"^( +)|\\n( +)"
としたのですが、
(2147483647,0)という文字列の外の範囲がマッチされてしまい、置換しようとしてエラーとなってしまいます。
文字列途中も含めて、行頭の半角スペース列のみを置換するためにはどのようなパターンを使うのが適切でしょうか?

696:デフォルトの名無しさん
12/03/24 08:46:28.26
>>695
URLリンク(developer.apple.com)

のTable 4 Flag Optionsを参考に、
mフラグを有効化して正規表現を複数行モードで
動作させればうまくいくかも

697:デフォルトの名無しさん
12/03/24 10:41:37.22
>>696
ありがとうございます!出来ました。

698:デフォルトの名無しさん
12/03/24 10:43:25.54
Comp
URLリンク(technet.microsoft.com)(v=ws.10).aspx

699:デフォルトの名無しさん
12/03/24 11:34:08.06
半角かっこはencodeして欲しい。
URLリンク(technet.microsoft.com)


700:デフォルトの名無しさん
12/03/25 01:29:15.20
700GET

701:デフォルトの名無しさん
12/03/25 04:06:16.60
private class Person
{
 public String personText = "Person";
}

private class Student : Person
{
 private String studentText = "Student";
 
 public String getText()
 {
  return (personText + studentText);
 }
}

public class Entry {
 public static void test(Person p) {
  Student s = p as Student;
  Console.Write(s.getText());
 }
}

これで、Entry.testをコールした後、GCでstudentTextは解放されるのでしょうか?

702:デフォルトの名無しさん
12/03/25 04:47:56.03
誤爆か

703:デフォルトの名無しさん
12/03/25 12:40:22.05
すみません、前と似たような質問なんですが
Objective-CのNSRegularExpressionで、
数値実体参照を置換しようとして、@"&#[0]*([1-9][0-9]*);?"と書いたのですが、
&#xまた&#Xで始まる16進表記に対応できないので、16進表記にも対応しようとして
@"&#[0]*([1-9][0-9]*);?|&#[xX][0]*([1-9A-Fa-f][0-9A-Fa-f]*);?"
としたのですが、
やはり(2147483647,0)という文字列の外の範囲がマッチされてしまい、置換しようとしてエラーとなってしまいます。
また、エラーが出なかったとしても10進か16進かがわからないので、再度プリフィクスが&#か&#xか調べないといけないので効率が悪い感じです。
10進も16進もマッチし、かつ10進か16進かを識別するためにはどのようなパターンを使うのが適切でしょうか?

704:696
12/03/25 13:38:44.57
>>703
10進にマッチした時と16進にマッチした時で置換後の文字列を変える目的や
それぞれどんな文字列に置換したいのがわからないと何とも言えません

多くの正規表現実装では()でグルーピングする度に
$1から連番で「キャプチャ」され、置換後文字列として$1や$2…でキャプチャされた部分を取り出せますが、
今回のケースで有用かが不明です

$nの詳細は>>696のリンク先のTable 3 Template Matching Format参照

705:デフォルトの名無しさん
12/03/25 14:02:53.15
>>704
ありがとうございます。
10進と16進で処理を変えたいのは、マッチした部分をキーにしてディクショナリから置換後の文字列(というか文字)を取り出すさい、
16進のキーはディクショナリに用意していないので、いったん10進文字列に変換してから同じようにディクショナリにアクセスさせたいためです。(変換メソッドは10進か16進か自動判別してくれないのでここで処理を分ける他ありません。)
$の使い方についてなのですが、キャプチャされた部分を取り出して$表記を用いた別の文字列(template)にキャプチャした部分を埋め込めるというのは分かるのですが
別の文字列のある部分を$~に置換するのではなくて、$でキャプチャした元の文字列自体を置換したいので、今回使えるかどうかはよくわかりませんでした
いろいろやってみたところrangeがぶっ飛んだ値になるのは、()を|などで分けて2つ以上設定した際に、マッチしなかった()について対応するインデックスのrangeのlocationがNSIntegerの最大値に設定されてしまうらしく
その値で分岐して、locationがNSIntegerMAXではないほうをキーとして取り出し置換することでとりあえず上手くいきました。

706:デフォルトの名無しさん
12/03/25 14:54:16.01
[xX]もキャプチャすれば判断できそうだけど。
置換対象はマッチした文字列全体でいいのでは。その環境使ったことないので、もし全体が取れないのなら全体をキャプチャ

707:696
12/03/25 15:36:35.36
>>706
マニュアル読む限り、$0でマッチした文字列全体みたい
自分も環境がないので試してはいませんが

708:デフォルトの名無しさん
12/03/25 20:21:11.43
>>705
「locationがNSIntegerMAXではないほうをキーとして取り出し」
で解決したみたいだけど、正規表現のマッチ文字列による処理分岐させる王道はこんな感じで、
OR条件は正規表現の|に頼らずに言語のif~else文使うのが良いかと

before = 文字参照文字列
if hoge =~ /�*([1-9][0-9]*);?/
after = searchDic($1)
elseif hoge =~ /&#[xX]0*([1-9A-Fa-f][0-9A-Fa-f]*);?/
after = searchDic(hex2Dec($1))
else
文字参照じゃなかったよ


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch