Удалите все строки в {} разделителе, используя Regex или Html Agility Pack в веб-формах ASP.NET
Я пытаюсь извлечь текст только с веб-страницы и отображаться, и я использую HtmlAgilityPack, чтобы выполнить извлечение текста, но текст возвращается с текстом javascript и css, и я не хочу этого, поэтому я пытаясь обнаружить {} разделитель, чтобы удалить всю строку в {} разделителе, чтобы удалить весь текст javascript и css из возвращаемого текста, и я использую регулярное выражение для этого, но не работает, потому что у меня есть вложенный {}, и это мой regex, с которым я пытаюсь:
string regex = "\t|\n|<.*?>|(\\[.*\\])|(\".*\")|('.*')|(\\(.*\\))|{\\[.*\\]}|{\".*\"}|{'.*'}|{\\(.*\\)}";
TextArea1.Value = Regex.Replace(s, regex, "");
Текст ввода:
Los Angeles Times - California, national and world news - Los Angeles Times;},svginImg:function;a.onload=function{var a=navigator.userAgent||navigator.vendor||window.opera;return/;},isIE9:function==9;}},notmobileCalccheck:function;a.style.cssText=;return !!a.style.length;},isAndroidBrowser:function{var a=navigator.userAgent||navigator.vendor;return/android/i.test&&!window.opera;},isSupportedBrowser:function&&!window.opera;},getScreenWidth:function;},isSupported:function isSupported{a=sessionStorage==;}else{try{a=this.supportsSvg{a=false;}}if<=8;}};trb.utils.redirect=function;b.name=;document.body.appendChild;b.submit;if{localStorage=d;}else{for{var c={};for{c;}return null;},remove:function remove;localStorage.removeItem{var b=localStorage;if;a=),f;for;}}},remove:function remove{a.trb=a.trb||{};trb.data=trb.data||{};trb.data.isMobile=trb.browsersupport.isMobile;trb.data.isIE9=trb.browsersupport.isIE9;trb.data.facebookAppId=;trb.data.parentSectionPath=);}if;}trb.data.isSectionFront=true;if;}trb.data.videos={};trb.data.videos.ndnFallbackJsURL=;trb.data.initialpathname=;trb.data.pages=trb.data.pages||{};trb.data.pages={};trb.data.pages.unsupportedBrowserPath=;trb.svg={};trb.svg.data={};trb.svg.data.svgStrings={};trb.svg.data.svgStrings.logoShort=;trb.svg.data.svgStrings.logo=;trb.svg.data.svgStrings.loadingCircle=;trb.svg.data.map={mastheadLogo:{colors:{PRIMARY_COLOR:},string:trb.svg.data.svgStrings.loadingCircle}}; { background: #404040; } .trb_allContentWrapper { background: #333; }
Ответы
Ответ 1
Я использовал HtmlAgilityPack для загрузки веб-страницы и извлечения текстового содержимого только тогда, когда я загружаю страницу и извлекаю текст, текст CSS и javascript также извлекается, поэтому я пытаюсь использовать этот метод регулярного выражения для удаления javascript и css из выходного текста, обнаружив {} разделитель, но был трудным, поэтому я пытаюсь использовать его, и он работает намного проще, используя Descendants()
из HtmlAgilityPack, а мой код
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(url);
doc.DocumentNode.Descendants()
.Where(n => n.Name == "script" || n.Name == "style" || n.Name == "#comment")
.ToList()
.ForEach(n => n.Remove());
string s = doc.DocumentNode.InnerText;
TextArea1.Value = Regex.Replace(s, @"\t|\n|<.*?>","");
и найдите это:
ЭТА ССЫЛКА
и теперь все работает.
Ответ 2
почему бы вам просто не попробовать:
/\{.*?\}/g
и ничего не замените.
Ответ 3
Вы хотите сопоставить весь случай '{' to '}', включая каждый символ, который не является '}' между парой, а затем используйте следующее:
/\{[^\}]+\}/g
Ответ 4
У вас есть вложенные фигурные скобки.
В Perl, PHP, Ruby вы можете сопоставить вложенные фигурные скобки с помощью (?R)
(синтаксис рекурсии). Но .NET не имеет рекурсии. Означает ли это, что мы потеряны? К счастью, нет.
Балансирующие группы для спасения
С# regex не может использовать рекурсию, но имеет удивительную функцию, называемую балансировочными группами.
Это регулярное выражение будет соответствовать полным вложенным скобкам.
(?<counter>{)(?>(?<counter>{)|(?<-counter>})|[^{}]+)+?(?(counter)(?!))
Например, он будет соответствовать
-
{sdfs{sdfs}sd{d{ab}}fs}
-
{ab}
- Но не
{aa
Ответ 5
int x=0, y=0;
int l=string.lastIndexOf("}");
do
{
x= string.indexof("{", x) + 1;
y= string.indexof{"}", x};
string.remove(x, y-x);
}
while(y!=l);