2015-04-14 2 views
1

У меня есть эти данные, эффективно в уценках таблица:Regex несколько матчей на нескольких линиях

blah blah blah 
| Tables  | Are   | Cool | 
| ------------- |:-------------:| -----:| 
| col 3 is  | right-aligned | $1600 | 
| col 2 is  | centered  | $12 | 
| zebra stripes | are neat  | $1 | 
blah blah 
blah 

Я хотел бы сделать матч регулярных выражений и получить значение между трубами из.

В идеале, я хотел бы получить группу для каждой строки, а затем подгруппу с каждой ячейкой.

Даже в идеале я хотел бы убедиться, что в каждой строке содержится одинаковое количество ячеек/столбцов.

Мои попытки либо совпадают с последней ячейкой в ​​строке/таблице, либо во второй ячейке. Это просто бомба из итого: \|(?:([^\r\n\|]*)\|)+\r?\n\|(?:(\:?-+\:?)\|)+\r?\n(\|(?:([^\r\n\|]*)\|)+\r?\n)+

Это также довольно мрачно: ^#(?:([^#]+)#)+$

ищет решения в JavaScript или C#.

+1

опубликуйте свои попытки. –

+0

Вводится ли одна строка? – guest271314

ответ

0

Я бы в JS-то вроде этого, но только если вам не нужно регулярное выражение для чего-то еще ;-)

var yourStr 
var groups = yourStr.split('\n') 
var cells = yourStr.split('|') 
if (cells.length < asItShouldBe) { ... } 
var cell1 = cells[1] 
var cell2 = cells[2] 
... 
0

Попробуйте

var input = document.querySelectorAll("pre")[0].innerText; 
 
var output = input.match(/\s+|\w+-\w+|\w+|\W+\d+|\d+/gi) 
 
      .map(function(word, i) { 
 
       return word.replace(/\||\s|--+|\s-\s+|:/gi, "") 
 
      }); 
 

 
document.body.insertBefore(
 
    document.createTextNode(output.join(" ")) 
 
, document.getElementsByTagName("hr")[0] 
 
);
<hr /> 
 
<pre> 
 
blah blah blah 
 
| Tables  | Are   | Cool | 
 
| ------------- |:-------------:| -----:| 
 
| col 3 is  | right-aligned | $1600 | 
 
| col 2 is  | centered  | $12 | 
 
| zebra stripes | are neat  | $1 | 
 
blah blah 
 
blah 
 
</pre>

Смежные вопросы