Split string by ". " except when after a number - c#

I want to split strings, by phrases, and to do that I'm doing this:
string.Split(new[] { ". ", "? ", "! " }, StringSplitOptions.None);
The thing is my string sometimes catch that after a number, when it has different points, and I want to separate by before the number, and not after, if it is possible.
original:
Com um processo de agendamento de não mais que 60 segundos, um
pagamento seguro, garantia de qualidade, a Wegho torna-se o meio mais
simples e conveniente de poder agendar serviços para o seu lar.
Entenda-se lar como a simbiose perfeita do ativo físico “casa” e do
ativo “emocional” família. Preparado para ter um parceiro de
excelência nos serviços que precisa para o seu lar? 1. Explore os
nossos serviços em Wegho.om 2. Selecione o serviço que pretende.
Através do código postal verificaremos se estamos presentes na área
que pretende 3. Escolha uma hora
result:
Com um processo de agendamento de não mais que 60 segundos, um
pagamento seguro, garantia de qualidade, a Wegho torna-se o meio mais
simples e conveniente de poder agendar serviços para o seu lar.
Entenda-se lar como a simbiose perfeita do ativo físico “casa” e do
ativo “emocional” família.
Preparado para ter um parceiro de excelência nos serviços que precisa
para o seu lar?
Explore os nossos serviços em Wegho.om
Selecione o serviço que pretende. Através do código postal verificaremos se estamos presentes na área que pretende
Escolha uma hora
And also, is it possible to keep the caught separating characters from which the string was split in the strings?

One approach is to split strings the way you do currently, and then go through the resultant list again, re-combining number-only strings with strings that immediately follow them:
var tokens = string.Split(new[] { ". ", "? ", "! " }, StringSplitOptions.None);
var res = new List<string>();
for (int i = 0 ; i < tokens.Length ; i++) {
var tok = tokens[i];
int ignore;
if (i != tokens.Length-1 && int.TryParse(tok, out ignore)) {
tok += ". "+tokens[++i];
}
res.Add(tok);
}
Note that your overall approach is fragile, because it is not possible to tell if a numeric part is a "bullet number" or not without some user mark-up to help you identify numbered bullets.

You could try regular expressions:
string pattern = #"([^\d][.!?][ ])";
string substitution = #"$1\n\n";
string input = #"Com um processo de agendamento de não mais que 60 segundos, um pagamento seguro, garantia de qualidade, a Wegho torna-se o meio mais simples e conveniente de poder agendar serviços para o seu lar. Entenda-se lar como a simbiose perfeita do ativo físico “casa” e do ativo “emocional” família. Preparado para ter um parceiro de excelência nos serviços que precisa para o seu lar? 1. Explore os nossos serviços em Wegho.om. 2. Selecione o serviço que pretende. Através do código postal verificaremos se estamos presentes na área que pretende. 3. Escolha uma hora";
RegexOptions options = RegexOptions.IgnoreCase;
Regex regex = new Regex(pattern, options);
string result = regex.Replace(input, substitution);
Check the full code and result.
However, the split will work inside the bullets also. And you will need to end your bullet content with a dot also.

Related

Loading ACIS file in solidworks with c# API

J'essaie d'automatiser le chargement de fichier SAT dans SolidWorks en faisant un Add-in.
pour cela j'utilise LoadFile4
swPart = (PartDoc)mSldWorksApplication.LoadFile4(fileNameToWorkOn,"r", ImportData, ref m_LongStatus);
Je n'arrive pas à lire le fichier (m_LongStatus=1)
voici une partie de mon code
foreach (var file in ListOfFiles)
{
if (file.EntityName.ToUpper().Contains(".SAT"))
{
using (Stream rStream = zipFileSystem.OpenFile(file, FileAccess.Read))
{
string fileNameToWorkOn = "d:\\temp\\" + file.EntityName;
var wfileStream = File.Create(fileNameToWorkOn);
rStream.CopyTo(wfileStream);
// work with the physical tempory files to import it in SolidWorks
//Import SAT file
ImportData = (Import3DInterconnectData)mSldWorksApplication.GetImportFileData(fileNameToWorkOn);
string fileNameToCreate = fileNameToWorkOn.ToUpper().Replace(".SAT", ".SLDPRT");
ModelDoc2 swModel = mSldWorksApplication.OpenDoc6(fileNameToCreate, (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", 0, 0);
swPart = (PartDoc)mSldWorksApplication.LoadFile4(fileNameToWorkOn,"r", ImportData, ref m_LongStatus);
swModel = (ModelDoc2)swPart;
//Close the model
mSldWorksApplication.CloseDoc(fileNameToCreate);
wfileStream.Close();
// delete now the physical tempory files
File.Delete(fileNameToWorkOn);
}
}
}
quelqu'un a t-il déjà eu ce problème ?

Captalize only month name and dayname in spanish datetime

I'm converting date to Spanish using following code:
Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");
string s_date = dateValue.ToLongDateString();
Output is:
sábado, 04 de febrero de 2017
Now, I need to captilize DayName and MonthName. Please let me know how this can be acheived.
Expected Output:
Sábado, 04 de Febrero de 2017
TextInfo textInfo = new CultureInfo("es-ES",false).TextInfo;
string s_date = textInfo.ToTitleCase( dateValue.ToLongDateString()).Replace(" De ", " de ");

How To Execute GenericHandler Method in C# WebService

I have to upload images to MySQL database, im using html, ajax, javascript and c#. I have 2 codes, 1 to upload the path of the image and the other upload the image in blop field, both work fine, but im using WebService and for the file upload Im using GenericHandler, my question is, How can I execute my methods but in my WebService?
Code of the GenericHandler:
public void ProcessRequest (HttpContext context)
{
string sql = "";
string ruta = "";
int files = 0;
//IF para comprobar que el total de archivos cargados sea mayor a 0
if (context.Request.Files.Count > 0)
{
//Variable que almacenara todos los archivos a cargar
HttpFileCollection SelectedFiles = context.Request.Files;
//Ciclor for para recorrer el arreglo y darle un indice a todos los archivos
for (int i = 0; i < SelectedFiles.Count; i++)
{
// Variable que tomara el valor dado por el for
HttpPostedFile PostedFile = SelectedFiles[i];
//Variable que tomar el valor de la ruta y el nombre del archivo que se guardara
string FileName = context.Server.MapPath("~/Uploads/" + PostedFile.FileName);
// Metodo para guardar el archivo
files++;
PostedFile.SaveAs(FileName);
ruta = FileName;
if (files == SelectedFiles.Count)
sql += ruta;
else
sql += ruta + '|';
}
FileUpload fu = new FileUpload(sql);
conn.Foto(fu, 1);//hjjiijj.mnbfgytrvgfdhghhygd
}
// Else para mandar mensaje de error.
else
{
context.Response.ContentType = "text/plain";
context.Response.Write("Please Select Files");
}
//Mensaje al realizar el metodo satisfactoriamente
context.Response.ContentType = "text/plain";
context.Response.Write("Files Uploaded Successfully!!");
}
Use ajax, and in the url you call your generichandler.

How to stop a background worker thats on a new thread, how to cancel when worker has multiple functions? [duplicate]

This question already has answers here:
How to stop BackgroundWorker correctly
(8 answers)
Closed 6 years ago.
I call the CancelAsync but in my DoWork functio I cant figure out where to check for that cancellation event im middle of so many functions that need to be executed in orded for it to stop regardless of what function its now:
private void bwAsync_DoWork(object sender, DoWorkEventArgs e)
{
// The sender is the BackgroundWorker object we need it to
// report progress and check for cancellation.
BackgroundWorker bwAsync = sender as BackgroundWorker;
while (bwAsync.CancellationPending == false)
{
//Criar o Backup dos ficheiros do cliente e do serviço antigo
UpdateMessage("A criar backup dos ficheiros de Cliente");
Program.Funcoes.DirectoryCopy(Global.OldClient, textBoxBackup.Text + "\\OrcaClientBackup", true, true);
bwAsync.ReportProgress(10);
UpdateMessage("A criar backup dos ficheiros do Serviço");
Program.Funcoes.DirectoryCopy(Global.OldService, textBoxBackup.Text + "\\OrcaServiceBackup", true, true);
bwAsync.ReportProgress(15);
////A Parar e desinstalar o Serviço Actual
UpdateMessage("A parar o Serviço existente");
Program.Funcoes.StopService("OrcaService", 1000, true);
bwAsync.ReportProgress(20);
//Eliminar os ficheiros do Serviço Antigo
UpdateMessage("A preparar os ficheiros para actualizar o cliente");
//Program.Funcoes.DeleteAll(Global.OldService);
bwAsync.ReportProgress(30);
//Eliminar os ficheiros do Serviço Antigo
//Program.Funcoes.DeleteAll(Global.OldClient);
UpdateMessage("A preparar os ficheiros para actualizar o serviço");
bwAsync.ReportProgress(40);
//Copiar os Novos Ficheiros
UpdateMessage("A actualizar o Cliente");
Program.Funcoes.DirectoryCopy(Global.NovoCliente, Global.OldClient, true, false);
bwAsync.ReportProgress(50);
UpdateMessage("A actualizar o Serviço");
Program.Funcoes.DirectoryCopy(Global.NovoServiço, Global.OldService, true, false);
bwAsync.ReportProgress(55);
//Fazer as alterações ao Orca.config.exe
UpdateMessage("A configurar o Cliente");
WriteConfigOrca(Global.OldClient);
Program.Funcoes.UpdateCliente(Global.OldClient + #"\Orca.exe.config", Global.NovoCliente + #"\Orca.exe.config");
bwAsync.ReportProgress(70);
UpdateMessage("A configurar o Serviço");
Program.Funcoes.UpdateService(Global.OldService + #"\OrcaService.exe.config", Global.NovoServiço + #"\OrcaService.exe.config");
//WriteConfigOrcaService(Program.OldService + "\\OrcaService.exe.config");
bwAsync.ReportProgress(85);
//Instalar o serviço
UpdateMessage("A instalar o novo Serviço");
Program.Funcoes.InstallService(Global.OldService + "\\OrcaService.exe");
Thread.Sleep(100);
bwAsync.ReportProgress(100);
return;
}
}
Where do I need to check for that cancellationPending?
The CancelAsync() method does nothing else but set the bwAsync.CancellationPending flag to true on the worker's thread. In order for the cancellation to actually do anything, you have to verify the flag whenever you deem the process ready to be canceled, something like this:
private void bwAsync_DoWork(object sender, DoWorkEventArgs e)
{
// The sender is the BackgroundWorker object we need it to
// report progress and check for cancellation.
BackgroundWorker bwAsync = sender as BackgroundWorker;
if(!bwAsync.CancellationPending)
{
//Criar o Backup dos ficheiros do cliente e do serviço antigo
UpdateMessage("A criar backup dos ficheiros de Cliente");
Program.Funcoes.DirectoryCopy(Global.OldClient, textBoxBackup.Text + "\\OrcaClientBackup", true, true);
bwAsync.ReportProgress(10);
}
if(!bwAsync.CancellationPending)
{
UpdateMessage("A criar backup dos ficheiros do Serviço");
Program.Funcoes.DirectoryCopy(Global.OldService, textBoxBackup.Text + "\\OrcaServiceBackup", true, true);
bwAsync.ReportProgress(15);
}
if(!bwAsync.CancellationPending)
{
////A Parar e desinstalar o Serviço Actual
UpdateMessage("A parar o Serviço existente");
Program.Funcoes.StopService("OrcaService", 1000, true);
bwAsync.ReportProgress(20);
}
if(!bwAsync.CancellationPending)
{
//Eliminar os ficheiros do Serviço Antigo
UpdateMessage("A preparar os ficheiros para actualizar o cliente");
//Program.Funcoes.DeleteAll(Global.OldService);
bwAsync.ReportProgress(30);
}
if(!bwAsync.CancellationPending)
{
//Eliminar os ficheiros do Serviço Antigo
//Program.Funcoes.DeleteAll(Global.OldClient);
UpdateMessage("A preparar os ficheiros para actualizar o serviço");
bwAsync.ReportProgress(40);
}
if(!bwAsync.CancellationPending)
{
//Copiar os Novos Ficheiros
UpdateMessage("A actualizar o Cliente");
Program.Funcoes.DirectoryCopy(Global.NovoCliente, Global.OldClient, true, false);
bwAsync.ReportProgress(50);
}
if(!bwAsync.CancellationPending)
{
UpdateMessage("A actualizar o Serviço");
Program.Funcoes.DirectoryCopy(Global.NovoServiço, Global.OldService, true, false);
bwAsync.ReportProgress(55);
}
if(!bwAsync.CancellationPending)
{
//Fazer as alterações ao Orca.config.exe
UpdateMessage("A configurar o Cliente");
WriteConfigOrca(Global.OldClient);
Program.Funcoes.UpdateCliente(Global.OldClient + #"\Orca.exe.config", Global.NovoCliente + #"\Orca.exe.config");
bwAsync.ReportProgress(70);
}
if(!bwAsync.CancellationPending)
{
UpdateMessage("A configurar o Serviço");
Program.Funcoes.UpdateService(Global.OldService + #"\OrcaService.exe.config", Global.NovoServiço + #"\OrcaService.exe.config");
//WriteConfigOrcaService(Program.OldService + "\\OrcaService.exe.config");
bwAsync.ReportProgress(85);
}
if(!bwAsync.CancellationPending)
{
//Instalar o serviço
UpdateMessage("A instalar o novo Serviço");
Program.Funcoes.InstallService(Global.OldService + "\\OrcaService.exe");
Thread.Sleep(100);
bwAsync.ReportProgress(100);
}
return;
}
Obviously if you need some cleanup to do while cancelling the worker, do that before you return.

Regex, I need to improve a method to get src and alt from an image

There is no problem to get the src or alt separately,but how can get both at the same time every one with a group name.
We have to bear in mind that alt can be to the left or right of src.
I am in a hurry, so I found a quick solution, creating 3 groupnames for the src, and and for alt. I know we can do it a lot better.
private void GetFirstImage(string newHtml, out string imgstring, out string imgalt)
{
imgalt = "";
imgstring = "";
string pattern = "(?<=<img(?<name1>\\s+[^>]*?)src=(?<q>['\"]))(?<url>.+?)(?=\\k<q>)(?<name2>.+?)\\s*\\>";
try
{
//si hay imagen
if (Regex.IsMatch(newHtml, pattern))
{
Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
imgstring = r.Match(newHtml).Result("${url}");
string tempalt = "", tempalt2;
tempalt = r.Match(newHtml).Result("${name1}");
tempalt2 = r.Match(newHtml).Result("${name2}");
//ya tenemos la ruta de la imagen y de lo que aparece a izq y a derecha dentro de <img>
try
{
pattern = "alt=(?<q>['\"])(?<alt>.+?)(?=\\k<q>)";
//si hay algo que no sea vacío a la izquierda de la ruta
if(!String.IsNullOrEmpty(tempalt.Trim()))
{
r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
//si cumple con el pattern para buscar el alt
if (Regex.IsMatch(tempalt, pattern))
{
imgalt = r.Match(tempalt).Result("${alt}");
}
}
//si no se encontró el alt y hay algo a la derecha
if(String.IsNullOrEmpty(imgalt) && !String.IsNullOrEmpty(tempalt2.Trim()))
{
r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
//si se cumple el patrón del alt
if (Regex.IsMatch(tempalt2, pattern))
{
imgalt = r.Match(tempalt2).Result("${alt}");
}
}
}
catch{ }
}
}
catch{}
}
Simple... don't use Regex. Use a DOM parser - so XmlDocument for xhtml or the HTML Agility Pack for (non-x)html.
Then just query root.SelectNodes("//img") and look at the "src" and "alt" attributes on each element (i.e. node.Attributes["src"].Value, etc)
Regex is NOT a good tool for parsing html (since it is not a regular language).

Categories

Resources