Использование функции String
match()
не возвратит захваченные группы, если установлен глобальный модификатор, как вы выяснили.
В этом случае вы хотели бы использовать RegExp
и вызвать функцию exec()
. String
's match()
почти идентичен функции RegExp
exec()
... кроме случаев, подобных этим. Если глобальный модификатор установлен, нормальная функция match()
не вернет захваченные группы, тогда как функция RegExp
exec()
будет. (Замечание здесь , среди других мест.)
Еще один улов, который следует помнить, заключается в том, что exec()
не возвращает совпадений в одном большом массиве - он продолжает возвращать совпадения до тех пор, пока он не будет запущен , и в этом случае он возвращает null
.
Итак, например, вы можете сделать что-то вроде этого:
var pattern = /t(e)(s)t/g; // Alternatively, "new RegExp('t(e)(s)t', 'g');"
var match;
while (match = pattern.exec(text)) {
// Do something with the match (["test", "e", "s"]) here...
}
Еще одно замечание: RegExp.prototype.exec()
и RegExp.prototype.test()
выполнить регулярное выражение в предоставленной строке и вернуть первый результат. Каждый последовательный вызов будет проходить через обновление набора результатов RegExp.prototype.lastIndex
на основе текущей позиции в строке.
Вот пример: // помните, что в примере и шаблоне есть 4 совпадения. lastIndex начинается с 0
pattern.test(text); // pattern.lastIndex = 4
pattern.test(text); // pattern.lastIndex = 9
pattern.exec(text); // pattern.lastIndex = 14
pattern.exec(text); // pattern.lastIndex = 19
// if we were to call pattern.exec(text) again it would return null and reset the pattern.lastIndex to 0
while (var match = pattern.exec(text)) {
// never gets run because we already traversed the string
console.log(match);
}
pattern.test(text); // pattern.lastIndex = 4
pattern.test(text); // pattern.lastIndex = 9
// however we can reset the lastIndex and it will give us the ability to traverse the string from the start again or any specific position in the string
pattern.lastIndex = 0;
while (var match = pattern.exec(text)) {
// outputs all matches
console.log(match);
}
Вы можете найти информацию о том, как использовать RegExp
объекты на MDN (в частности, здесь представлена документация для exec()
функция [/ д2]).
iTextSharp http://itextsharp.sourceforge.net/
, Сложный но всесторонний.
Ну, свободный и не бесплатно, я использую .NET WebSuperGoo ABCpdf компонент, что я просто люблю его!
не бесплатно , потому что необходимо заплатить за него.
для свободного , потому что, даже если необходимо заплатить, у них есть пробная версия и Вы можете запрашивать бесплатную лицензию , если Вы не возражаете, это, на Вашем шоу сайта "Этот сайт использует компонент.NET WebSuperGoo ABCpdf" со ссылкой на их веб-сайт.
я сделал это, и я получил бесплатную лицензию (версия 5 в то время) так, я могу сказать, что это работает (даже если веб-сайт больше не онлайн) - я все еще имею и использую компонент ~:)
А замечательная вещь, которую я люблю с этим, состоит в том, что можно сделать все, что Вы можете вещь прочь с этим, создать формы PDF и динамично заполнить их и отправить пользователю почтой или иметь их, чтобы загрузить его, создать PDF с нуля, преобразовать страницы HTML в PDF, и т.д. и т.д. и т.д., прочитайте документацию, это - замечательный компонент.
Я использовал ( iTextSharp) в прошлом с хорошими результатами.
Я отправил образец того, как использовать iTextSharp в одном из моих блогов:
Как насчет iTextSharp?
iText является PDF (среди других) библиотека поколения, которая также портирована (и сохранена в синхронизации) к C#.
Для этого я изучил под управлением ЛАТЕКСНЫЕ приложения для генерации PDF. Хотя эта опция, вероятно, будет намного более сложной и мощной, чем те перечисленные здесь.
Я использовал Gnostice в прошлом и нашел, что они очень хороши.
Взгляните на PDFSharp
, Это - открытый исходный код, и это записано в.NET, я использую его сам для некоторого поколения счета PDF.