0

単純な区切り文字で区切られたテキスト データベースが与えられた場合、列/フィールド エントリを返す正規表現ルールを構築したいと考えています。

次の2つの例の行が与えられた場合

entry1 = '|123|some|string   |101112  |'
entry2 = '|123|some|  |101112  |'

次の出力を取得したい:

values1 = '123', 'some', 'string', '101112'
values2 = '123', 'some', '', '101112'

これまでのところ、次regexpregexprep組み合わせを使用しています。

values = regexp(regexprep(entry '[\s]', ''), '\|', 'split')

残念ながら、次の結果が返されます。

values1 =  ''    '123'    'some'    'string'    '101112'    ''
values2 =  ''    '123'    'some'    ''    '101112'    ''

しかし、私は取得したいです(の''前に余分なものはなく、後に123余分なものはありません):'''101112'

values1 = '123', 'some', 'string', '101112'
values2 = '123', 'some', '', '101112'

私の正規表現ルールを考えると、なぜ''最初と最後に を取得するのですか? フィールド値のみを返すように正規表現ルールを変更するにはどうすればよいですか?

4

2 に答える 2

1

それがまさにあなたが求めているものかどうかはわかりませんが、使用できますstrread

strread(entry1(2:end),'%d','delimiter','|')
ans =
         123
         456
         789
      101112
于 2012-08-24T15:51:13.360 に答える
0

matlab に文字で分割するように指示するため、空の文字列が存在します|。そして、分割とは、そこで切断することを意味します。の前|に何もない場合は、空の文字列が返されます。たとえば、これを分割します ( の後の部分結果regexprep):

'|123|456|789|101112|'

結果は ( で文字列を切断することを想像してください|):

'', '123', '456', '789', '101112', ''

したがって、文字列を最初と最後の間で分割します|

nospaces = regexprep(entry, '\s', '')
betweenpipes = nospaces(2:size(nospaces,2)-1)
values = regexp(betweenpipes, '\|', 'split')

..または、分割をまったく使用せずに、必要なパターンを検索するだけです。

regexp(entry, '(?=\)(?:\s*)(\d+)(?:\s*)(?=\)', 'match')

正規表現の説明:

  1. を探しますが|、覚えていません。(?=\|)
  2. 可能性のある空白をスキップしますが、覚えていません:(?:\s*)
  3. 数字に一致:(\d+)
  4. 可能性のある空白をスキップしますが、覚えていません:(?:\s*)
  5. を探しますが|、覚えていません。(?=\|)

ここにはmatlabがないので、記憶からこれを書いているので、バグがあるかもしれません..

于 2012-08-24T16:24:31.627 に答える