J'utilise de nombreuses implémentations Regex différentes car cela se produit sur plusieurs systèmes (Linux, Windows, VS, notepad ++, etc.); c'est là que j'ai un client qui souhaite supprimer le dimensionnement automatique. L'intention est d'utiliser l'expression régulière dans n'importe quel outil pour trouver une ligne qui a une largeur mais qui n'a pas de profondeur automatique, puis ajouter la largeur automatique. Je demande simplement comment le trouver, mais j'ai l'intention d'utiliser ensuite ce que je trouve ici dans une chaîne de remplacement pour mon éditeur donné. J'ai le bit de remplacement vers le bas: je n'ai tout simplement pas compris comment obtenir l'un sans l'autre quand l'autre est loin de l'un.

En utilisant https://regex101.com/, j'ai essayé littéralement des dizaines de chaînes de recherche.

C'était mon point de départ pour une chaîne de recherche et quelques tentatives pour obtenir les lookarounds pour exclure AutoWidth n'importe où sur la ligne. Les cordes 2 et 3 sont fondamentalement la même chose, mais je ne savais pas quoi essayer d'autre. Je suppose que tout ce qui fonctionne pour le regard en arrière fonctionnera pour le regard en avant, mais comme vous pouvez le voir, je ne peux même pas travailler derrière.

(?<! AutoWidth="false") width="\d*"(?! AutoWidth="false")
(?<! AutoWidth="false").*? width="\d*"(?! AutoWidth="false")
(?<! AutoWidth="false")[0-9a-zA-Z" =]*? width="\d*"(?! AutoWidth="false")

Je suis coincé, mettre de la distance entre AutoWidth et width m'échappe.

Ce sont mes cibles

1->  <column name="Selected" AutoWidth="false" IsEditable="true" datatype="bool" width="20"/>
2->  <column width="40" AutoWidth="false" name="ExternalIdOrEmpty" index="XIDname" sort="true"/>
3->  <column width="40" name="Tax Rate" index="TRname" sort="true" AutoWidth="false"/>
4->  <column width="40" name="Total Tax" index="TTname" sort="true"/>
5->  <column name="Tax Deductible" index="TDname" sort="true"/>

Je veux trouver toutes les lignes qui contiennent

width = "\ d *"

Mais qui ne contiennent pas

AutoWidth = "\ d *"

N'importe où sur la même ligne.

Cela signifie que seule la ligne 4, dans les exemples ci-dessus, correspondrait à mes critères.

MISE À JOUR:

Je suis prêt à utiliser tout autre outil qui fera le travail. Donc XSLT, etc. sont tous bons. La seule exigence est que l'outil soit généralement disponible sur Windows, Linux et Mac, ET soit open source ou gratuit et est également bien connu.

Le xml complet est énorme. La fonction d'édition ici est limitée à 30,00 caractères, mais voici un bon échantillon.

<?xml version="1.0" encoding="utf-8" ?>
<spread>
  <ViewPatientOutboundReferralFilter>
    <FindColumn name="ViewUid" index="guid" visible="false" />
    <FindColumn name="Selected" caption=" " visible="true" IsEditable="true" datatype="bool"/>
    <FindColumn name="PatientName" caption="Patient Name" visible="true" width="150" hyperlink="true" AutoWidth="false"/>
    <FindColumn name="ReferToProviderName" caption="Provider" visible="true" AutoWidth="false" width="150" hyperlink="true"/>
    <FindColumn name="ReferredToMedicalServicesProviderName" caption="Medical Services Provider" visible="true" width="150" hyperlink="true"/>
    <FindColumn name="ProviderRole" caption="Provider Role" visible="true" width="80" hyperlink="true"/>
    <FindColumn name="StatusName" caption="Current Status" visible="true" width="100" hyperlink="true"/>
    <FindColumn name="ServiceSiteName" caption="Service Site" visible="true"/>
    <FindColumn name="VisitDate" caption="Visit Date" visible="true" width="90" datatype="date"/>
    <FindColumn name="AppointmentDate" caption="Appointment Date" visible="true" datatype="datetime" width="90"/>
    <FindColumn name="Notes" caption="Comments" visible="true" width="120"/>
    <FindColumn name="AppointmentNotes" caption="Referral Notes" visible="true" width="120"/>
    <FindColumn name="DisplayName" visible="false" index="name"  />
    <FindColumn name="ProviderUid" visible="false" storeproperty="true" />
    <FindColumn name="VisitUid" visible="false" storeproperty="true" />
    <FindColumn name="CreatedDate" caption="Created Date" visible="true" datatype="date" width="90"/>
    <FindColumn name="RequestingName" caption="Requesting Provider" visible="true" width="150" />
  </ViewPatientOutboundReferralFilter>
  <FeeScheduleFeeAA rowcount="3">
    <column row="0" rowspan="3" caption="Code" width="50" name="Procedure.Code" sort="true" index="name" />
    <column row="0" rowspan="3" caption="Description" relwidth="100%" width="80" AutoWidth="false" name="Procedure.ShortDescription" sort="true" />
    <column row="0" rowspan="3" caption="Amount Allowed" width="60" AutoWidth="false" name="Fee" IsEditable="true" datatype="currency" />
    <column row="0" rowspan="3" caption="Global Period" width="40" AutoWidth="false" name="GlobalPeriodDays" IsEditable="true" datatype="number" decimalPlaces="0" minValue="0" maxValue="1000" />
    <column row="0" colspan="5" caption="Coinsurance" />
    <column row="1" colspan="2" caption="Insurance Percent" />
    <column row="2" caption=" " width="30" AutoWidth="false" name="RadioInsurancePercent" IsEditable="true" datatype="radio" radioOrientation="vertical" radioItems=" " />
    <column row="2" caption="Value" width="70" AutoWidth="false" name="InsurancePercent" IsEditable="true" datatype="number" decimalPlaces="0" minValue="0" maxValue="100" />
    <column row="1" colspan="2" caption="Insurance Plan" />
    <column row="2" caption="PCP/Specialist" width="95" AutoWidth="false" name="RadioInsurancePlanPhysician" IsEditable="true" datatype="radio" radioOrientation="vertical" radioItems=" " />
    <column row="2" caption="Other" width="55" AutoWidth="false" name="RadioInsurancePlanOther" IsEditable="true" datatype="radio" radioOrientation="vertical" radioItems=" " />
    <column row="1" rowspan="2" caption="Copay Amount" width="70" AutoWidth="false" name="FixedCopayAmount" datatype="currency" IsEditable="true" />
    <column row="0" rowspan="3" caption="Contract Type" width="55" AutoWidth="false" name="ContractTypeCode.Name" sort="true"/>
    <column row="0" rowspan="3" caption="Family Planning" width="55" AutoWidth="false" name="FamilyPlanning" IsEditable="true" datatype="bool" />
    <column row="0" rowspan="3" caption="Alt Insurance Plan" width="55" AutoWidth="false" name="UseAlternateInsurancePlan" IsEditable="true" datatype="bool" />
    <column row="0" rowspan="3" caption="Edit Billing Rule" width="70" visible="false" IsEditable="true" datatype="CustomCellType" celltype="iMedica.Prm.Client.UI.BaseControls.Spread.PrmNeoCellImageButton,iMedica.Prm.Client.UI.BaseControls" ShowSortIndicator="false" ImageResourceName="iMedica.Prm.Client.UI.BaseControls.Icons.BillingRule.png" ImageResourceAssembly="iMedica.Prm.Client.UI.BaseControls" sort="false" />
  </FeeScheduleFeeAA>
</spread>
3
Display name 20 avril 2017 à 17:42

3 réponses

Meilleure réponse

C'est un problème assez trivial dans XSLT. Étant donné une entrée bien formée telle que:

XML

<root>
    <column name="Selected" AutoWidth="false" IsEditable="true" datatype="bool" width="20"/>
    <column width="40" AutoWidth="false" name="ExternalIdOrEmpty" index="XIDname" sort="true"/>
    <column width="40" name="Tax Rate" index="TRname" sort="true" AutoWidth="false"/>
    <column width="40" name="Total Tax" index="TTname" sort="true"/>
    <column name="Tax Deductible" index="TDname" sort="true"/>
</root>

La feuille de style suivante:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="column/@width[not(../@AutoWidth)]">
    <xsl:copy/>
    <xsl:attribute name="AutoWidth">False</xsl:attribute>
</xsl:template>

</xsl:stylesheet>

Retournera:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <column name="Selected" AutoWidth="false" IsEditable="true" datatype="bool" width="20"/>
  <column width="40" AutoWidth="false" name="ExternalIdOrEmpty" index="XIDname" sort="true"/>
  <column width="40" name="Tax Rate" index="TRname" sort="true" AutoWidth="false"/>
  <column width="40" AutoWidth="False" name="Total Tax" index="TTname" sort="true"/>
  <column name="Tax Deductible" index="TDname" sort="true"/>
</root>

Cela correspond à un attribut width qui n'a pas de frère AutoWidth, le copie et ajoute le frère manquant. Ici, j'ai limité la portée aux éléments column uniquement, mais vous pouvez l'étendre à n'importe quel élément en faisant:

<xsl:template match="@width[not(../@AutoWidth)]">
6
michael.hor257k 20 avril 2017 à 15:17

Le xpath est le suivant: //column[@width and not(@AutoWidth)].

Explication:

  • //column trouve tous les éléments <column ...>
  • [...] contient les prédicats
  • @width vérifie la présence de l'attribut @widht
  • not(@AutoWidth) vérifie l'absence de l'attribut @AutoWidth.

J'ai utilisé le testeur xpath sur freeformatter.com pour les tests.

J'ai ajouté un élément <foo> pour le rendre XML bien formaté. C'est à dire. c'était le xml réel que j'ai utilisé pour les tests:

<foo>
  <column name="Selected" AutoWidth="false" IsEditable="true" datatype="bool" width="20"/>
  <column width="40" AutoWidth="false" name="ExternalIdOrEmpty" index="XIDname" sort="true"/>
  <column width="40" name="Tax Rate" index="TRname" sort="true" AutoWidth="false"/>
  <column width="40" name="Total Tax" index="TTname" sort="true"/>
  <column name="Tax Deductible" index="TDname" sort="true"/>
</foo>

Ensuite, voici le xpath: //column[@width and not(@AutoWidth)]

Il sélectionne un seul élément: <column index="TTname" name="Total Tax" sort="true" width="40"/>. Je crois que c'est ce dont vous avez besoin.

4
Tamas Rev 20 avril 2017 à 15:04

Il existe une autre solution rapide avec grep. Il a besoin d'un shell bash, par exemple celui de git-bash depuis Windows.

cat lines.txt | grep -P -v 'AutoWidth="[^"]*"' | grep -P 'width="[^"]*"'

Explication:

  • cat lines.txt - c'est de là que viennent vos données
  • grep -P' active la syntaxe Perl dans un souci de simplicité
  • grep -v ne conserve que les lignes non correspondantes
  • "[^"]*" correspond à tout ce qui se trouve entre les guillemets, mais ne va pas plus loin après la première citation

Voici le résultat avec vos données d'exemple:

4->  <column width="40" name="Total Tax" index="TTname" sort="true"/>
1
Tamas Rev 20 avril 2017 à 15:13