This question already has answers here:
Get text between 2 html tags c#
(3 answers)
Closed 3 years ago.
I have some data in a file and I am using Regex to get individual elements and remove all the \r\n between the <opening> and </closing> tags.
But when i am trying to select the elements separately, at the end, the whole data is getting selected as one group.
This is my Regex:
(<([ph0-9figc]+)>)([a-zA-Z0-9äöüÄÖÜß[:punct:] \n\r\t])+(<\/\2>)
Sample with Input Data
It may not be the best idea to do this task with regular expressions, especially for replacing new lines.
If we really have to, we might want to capture those tags one by one. For instance, this expression only captures the p tags using three capturing groups ():
(<p>)([\s\S]*?)(<\/p>)
regex101.com.
RegEx Circuit
We can also visualize your expressions in jex.im:
JavaScript Demo
const regex = /(<p>)([\s\S]*?)(<\/p>)/gm;
const str = `<p>
<st>Liebe stern-Redaktion,
</st>
<i>Liebe stern-Redaktion,</i> warum schreiben Sie nicht, was wirklich freitags whrend der Protest-Demos am Grenzzaun passiert? Wie die Familien der Mrder fr jede gettete jdische Person belohnt werden? Oder ber die Feuerballons, die aus dem Gazastreifen in den Sden Israels geschickt werden? Brita Singh, Scheeel</p>
<fig>
<img src="images/img_8-1.jpg" width="596" height="428" alt="" />
<fc>
<i>stern</i> Nr. 10/2019, Bild der Woche: Kindertrauer im Gazastreifen</fc>
</fig>
<p>
<i>Sehr geehrte Frau Singh,</i> bei Demonstrationen am Grenzzaun starben laut Bericht der UN-Kommission in neun Monaten 35 Kinder durch Schüsse israelischer Soldaten. Zwei Journalisten und drei Sanitäter wurden erschossen, über 6000 Menschen verletzt. Israel hat gerade Ermittlungen zu elf der Todesfälle aufgenommen. Dagegen hat es in dem Zeitraum kein israelisches Todesopfer am Grenzzaun zu Gaza gegeben. Die Hamas pflegt einen Märtyrerkult und belohnt Morde mit Geld; israelische Sicherheitskräfte zerstören Häuser von Angehörigen palästinensischer Attentäter. Beides fördert den Hass. Opfer sind Menschen wie das Mädchen auf diesem Bild. Der <i>stern</i> hat keinen einseitigen Blick auf die Komplexität des Nahostkonflikts wir schauen stets auf beide Seiten. <i>Mit freundlichen Grüßen Cornelia Fuchs, Ressortleiterin Ausland</i></p>
<p>Eine liebevolle Mutter will, dass ihr Kind glücklich ist, egal, ob sie sein Leben versteht. Alles andere ist Egoismus und keine Mutterliebe. </p>
<p>Annemarie Fischer, Wielenbach</p>`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
C# Test
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = #"(<p>)([\s\S]*?)(<\/p>)";
string input = #"<p>
<st>Liebe stern-Redaktion,
</st>
<i>Liebe stern-Redaktion,</i> warum schreiben Sie nicht, was wirklich freitags whrend der Protest-Demos am Grenzzaun passiert? Wie die Familien der Mrder fr jede gettete jdische Person belohnt werden? Oder ber die Feuerballons, die aus dem Gazastreifen in den Sden Israels geschickt werden? Brita Singh, Scheeel</p>
<fig>
<img src=""images/img_8-1.jpg"" width=""596"" height=""428"" alt="""" />
<fc>
<i>stern</i> Nr. 10/2019, Bild der Woche: Kindertrauer im Gazastreifen</fc>
</fig>
<p>
<i>Sehr geehrte Frau Singh,</i> bei Demonstrationen am Grenzzaun starben laut Bericht der UN-Kommission in neun Monaten 35 Kinder durch Schüsse israelischer Soldaten. Zwei Journalisten und drei Sanitäter wurden erschossen, über 6000 Menschen verletzt. Israel hat gerade Ermittlungen zu elf der Todesfälle aufgenommen. Dagegen hat es in dem Zeitraum kein israelisches Todesopfer am Grenzzaun zu Gaza gegeben. Die Hamas pflegt einen Märtyrerkult und belohnt Morde mit Geld; israelische Sicherheitskräfte zerstören Häuser von Angehörigen palästinensischer Attentäter. Beides fördert den Hass. Opfer sind Menschen wie das Mädchen auf diesem Bild. Der <i>stern</i> hat keinen einseitigen Blick auf die Komplexität des Nahostkonflikts wir schauen stets auf beide Seiten. <i>Mit freundlichen Grüßen Cornelia Fuchs, Ressortleiterin Ausland</i></p>
<p>Eine liebevolle Mutter will, dass ihr Kind glücklich ist, egal, ob sie sein Leben versteht. Alles andere ist Egoismus und keine Mutterliebe. </p>
<p>Annemarie Fischer, Wielenbach</p>";
RegexOptions options = RegexOptions.Multiline;
foreach (Match m in Regex.Matches(input, pattern, options))
{
Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
}
}
}
If you are willing to accept the extra "_" and other white space characters then I simplified your pattern as follows:
var pat = #"(<(?'tag'[ph0-9figc]+)>)(?'body'([\wäöüÄÖÜß\p{P}\s])+)(<\/\k'tag'>)";
And the regular expression removing the CR-LF is:
var body = m.Groups["body"].Value
.Replace(Environment.NewLine, " ")
.Replace("\r", " ")
.Replace("\n", " ");
var tag = m.Groups["tag"].Value;
var noCrLf = re.Replace(text, m => $"<{tag}>{body}</{tag}>");
Though looking at your data, I may not have understood what you are after. One of your tags, for example, is not matched by your tag pattern "[ph0-9figc]+". If I did not understand your concern, please straighten me out.
I'm using https://github.com/gmamaladze/globalmousekeyhook for a program. The hook fires, but after some time there comes a CallbackOnCollectedDelegate and i don't have the knowledge for changing the code from github. I couldn't transform the help from into my code CallbackOnCollectedDelegate in globalKeyboardHook was detected
The failuremessage in Visual Studio (Language German) is:
CallbackOnCollectedDelegate ist aufgetreten. Message: Der Assistent
für verwaltetes Debugging ""CallbackOnCollectedDelegate"" hat ein
Problem in
""C:\Users\Admin\ownCloud\GRANT-ZIM\Code_Grant\Filter\GRANTExample\bin\x64\Debug\GRANTExample.vshost.exe""
festgestellt. Zusätzliche Informationen: Für den von der Garbage
Collection gesammelten Delegaten vom Typ
"Gma.System.MouseKeyHook!Gma.System.MouseKeyHook.WinApi.HookProcedure::Invoke"
wurde ein Rückruf durchgeführt. Dies kann Anwendungsabstürze,
Datenbeschädigung und -verlust zur Folge haben. Beim Übergeben von
Delegaten an nicht verwalteten Code müssen die Delegaten von der
verwalteten Anwendung beibehalten werden, bis sichergestellt ist, dass
sie nie aufgerufen werden.
The used code is:
private IKeyboardMouseEvents m_GlobalHook;
public void Subscribe()
{
m_GlobalHook = Hook.GlobalEvents();
m_GlobalHook.MouseDownExt += GlobalHookMouseDownExt;
m_GlobalHook.KeyUp += OnKeyUp;
}
I try to write an Obscured and Unobscured event, but there is one Error in:
PhoneApplicationFrame phoneAppRootFrame = (Application.Current as App).RootFrame
error:
Auf den Member 'Timer.App.RootFrame.get' kann nicht mit einem Instanzenverweis zugegriffen werden. Qualifizieren Sie ihn stattdessen mit einem Typnamen.
The Error is in German, because I'm using the German Version of Visual Studio
How I can solve the problem?
EDIT:
code:
PhoneApplicationFrame phoneAppRootFrame = (Application.Current as App).RootFrame;
phoneAppRootFrame.Obscured += OnObscured;
phoneAppRootFrame.Unobscured += Unobscured;
I would like to add an OpenFileDialog to my application. The dialog opens as expected but as soon as I close the dialog I get an error regarding "CallbackOnCollectedDelegate". I looked for OpenFileDialog examples on the web but they do not look much different from my code. Also I looked at solutions for the "CallbackOnCollectedDelegate" error here on stackoverflow but unfortunately I do not see the point where my code fails.
I am using a similar constructions to open other self created dialog boxes in my program - without problems. This is the first time I try to use a predefined Dialog and maybe I am doing something strange here?
OpenFileDialog Dialog_OpenFile;
private void OpenFileButton_Click(object sender, EventArgs e) //open file
{
if (Dialog_OpenFile == null) //only create once
{
Dialog_OpenFile = new OpenFileDialog();
Dialog_OpenFile.InitialDirectory = ".";
Dialog_OpenFile.RestoreDirectory = false;
Dialog_OpenFile.Multiselect = false;
Dialog_OpenFile.Filter = "OpenOffice (*.ods)|*.ods|Microsoft Excel (*.xlsx)|*.xlsx";
Dialog_OpenFile.FilterIndex = 2;
}
DialogResult status = Dialog_OpenFile.ShowDialog();
if (status == DialogResult.OK) { ...do something... }
}
I have added the error message I get (unfortunately in German but the most important parts should be understandable):
Der Assistent für verwaltetes Debugging
""CallbackOnCollectedDelegate"" hat ein Problem in
""C:\Users...\Visual Studio
2013\Projects\myprog\myprog\bin\Debug\myprog.vshost.exe""
festgestellt. Zusätzliche Informationen: Für den von der Garbage
Collection gesammelten Delegaten vom Typ
"System.Windows.Forms!System.Windows.Forms.NativeMethods+WndProc::Invoke"
wurde ein Rückruf durchgeführt. Dies kann Anwendungsabstürze,
Datenbeschädigung und -verlust zur Folge haben. Beim Übergeben von
Delegaten an nicht verwalteten Code müssen die Delegaten von der
verwalteten Anwendung beibehalten werden, bis sichergestellt ist, dass
sie nie aufgerufen werden.
Ein Ausnahmefehler des Typs "System.NullReferenceException" ist in
System.Windows.Forms.dll aufgetreten. Zusätzliche Informationen: Der
Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
"myprog.vshost.exe" (CLR v4.0.30319: myprog.vshost.exe):
"C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll"
geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist
optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert. Das
Programm "[3452] myprog.vshost.exe" wurde mit Code 0 (0x0) beendet.
I have a solution with several projects, a main project, a globalization project and a test project.
When code in the main project retreives a message from the Messages.de.resx file of the globalization project everything works fine.
But when I copy the same code to the test project, I get a MissingManifestResourceException telling me no resources were found for the specified or neutral culture:
System.Resources.MissingManifestResourceException ist aufgetreten.
Message=Für die angegebene Kultur oder die neutrale Kultur konnten
keine Ressourcen gefunden werden. Stellen Sie sicher, dass
EGR_IQone_Globalization.Messages.resources beim Kompilieren richtig in
die Assembly EGR_IQone_Globalization eingebettet wurde, oder dass die
erforderlichen Satellitenassemblys geladen werden können und
vollständig signiert sind. Source=mscorlib StackTrace:
bei System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String
fileName)
bei System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo
culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean
createIfNotExists, StackCrawlMark& stackMark)
bei System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo
requestedCulture, Boolean createIfNotExists, Boolean tryParents,
StackCrawlMark& stackMark)
bei System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo
culture, Boolean createIfNotExists, Boolean tryParents)
bei System.Resources.ResourceManager.GetString(String name, CultureInfo culture)
bei System.Resources.ResourceManager.GetString(String name)
bei EGR_IQone_Globalization.UserMessage.GetMessage(String msgID, String[] arguments) in
C:\projects\EGR_IQoneH\EGR_IQone\EGR_IQone_Globalization\UserMessage.cs:Zeile
28. InnerException:
Normally, the code works just using the .resx file and even using resgen to compile it into a .resources file changes nothing.
I thought it might have to do with the ResourceManager or the specified Assembly, but I could not see any difference between the call from the main project and the call from the test project.
This is the code:
public static class UserMessage
{
private static ResourceManager _resourceManager;
static UserMessage()
{
string baseName = Assembly.GetAssembly(typeof(UserMessage)).GetName().Name + ".Messages.de";
Console.WriteLine(baseName);
_resourceManager = new ResourceManager(baseName, Properties.GlobalizationAssembly);
}
public static string GetMessage(string msgID, params string[] arguments)
{
string msg = "";
string error = "[Message Error] cannot read Message " + msgID;
try
{
//DefaultLanguage = 'de'
//using the GetString overload with or without CultureInfo paramter makes no difference
msg = _resourceManager.GetString(msgID, new CultureInfo(Properties.DefaultLanguage));
for (int i = 0; i < arguments.Length; i++)
{
msg = msg.Replace("{" + i.ToString() + "}", arguments[i]);
}
}
catch (Exception ex)
{
Console.WriteLine(error + "\r\n" + ex.ToString());
return error;
}
return msg;
}
}
http://pastebin.com/L0YNxyfK
Thanks!
I've had the same error - it suddenly occurred even though the application had been running for a while.
It helped to set the Thread.CurrentThread.CurrentUICulture before getting the resource.
Try the following or something similar:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-DE");
msg = _resourceManager.GetString(msgID);