1. $PIECE para cadenas delimitadas
Puntos Clave
- $PIECE($P): Extrae una subcadena basada en un delimitador y número de pieza
- $P(string, delimiter, from, to): Extrae piezas desde la posición "from" hasta "to"
- SET $PIECE: Modifica una pieza específica in situ: SET $P(var, delim, pos) = newValue
- Posiciones base 1: La primera pieza es la posición 1
- Delimitadores de múltiples caracteres: El delimitador puede tener más de un carácter: $P(str, "::", 2)
- Fuera de rango: Solicitar una pieza más allá del último delimitador devuelve cadena vacía
Notas Detalladas
Descripción general
$PIECE es una de las funciones de ObjectScript más utilizadas. Trabaja con cadenas delimitadas, extrayendo o reemplazando segmentos basados en un delimitador especificado. A diferencia de las listas, $PIECE trabaja con cadenas simples sin ninguna codificación especial.
Extracción básica
SET record = "Smith^John^42^New York"
// Extract individual pieces (1-based)
WRITE $PIECE(record, "^", 1), ! // Smith
WRITE $PIECE(record, "^", 2), ! // John
WRITE $PIECE(record, "^", 3), ! // 42
WRITE $PIECE(record, "^", 4), ! // New York
// $P shorthand
WRITE $P(record, "^", 1), ! // Smith
// Piece beyond range returns ""
WRITE $P(record, "^", 10), ! // (empty string)
Extracción de múltiples piezas
SET record = "Smith^John^42^New York^Engineer"
// Extract pieces 2 through 4
WRITE $P(record, "^", 2, 4), ! // John^42^New York
// Extract from piece 3 to end
WRITE $P(record, "^", 3, *), ! // 42^New York^Engineer
// First piece only (default when no position given)
WRITE $P(record, "^"), ! // Smith
Modificación de piezas con SET $PIECE
SET record = "Smith^John^42^New York"
// Replace piece 3 (age)
SET $PIECE(record, "^", 3) = 43
WRITE record, ! // Smith^John^43^New York
// $P shorthand for SET
SET $P(record, "^", 4) = "Boston"
WRITE record, ! // Smith^John^43^Boston
// Setting a piece beyond current range extends the string
SET $P(record, "^", 6) = "Active"
WRITE record, ! // Smith^John^43^Boston^^Active
// Note: piece 5 is empty, creating two consecutive delimiters
Construcción de cadenas pieza por pieza
// Start with empty string and build incrementally
SET msg = ""
SET $P(msg, "|", 1) = "MSH"
SET $P(msg, "|", 2) = "^~\&"
SET $P(msg, "|", 3) = "SENDING_APP"
WRITE msg, ! // MSH|^~\&|SENDING_APP
Delimitadores de múltiples caracteres
SET data = "key1::value1::key2::value2"
WRITE $P(data, "::", 1), ! // key1
WRITE $P(data, "::", 2), ! // value1
WRITE $P(data, "::", 4), ! // value2
Conteo de piezas con $LENGTH
SET csv = "a,b,c,d,e"
WRITE $LENGTH(csv, ","), ! // 5 (number of comma-delimited pieces)
SET empty = ""
WRITE $LENGTH(empty, ","), ! // 1 (empty string = 1 piece)
Referencias de Documentación
2. $EXTRACT para subcadenas
Puntos Clave
- $EXTRACT($E): Extrae caracteres por posición: $E(string, from, to)
- Carácter individual: $E(string, n) extrae el enésimo carácter (base 1)
- Rango: $E(string, from, to) extrae una subcadena
- SET $EXTRACT: Reemplaza caracteres in situ: SET $E(var, from, to) = replacement
- Desde el final: $E(string, *) obtiene el último carácter; $E(string, *-n) cuenta desde el final
- $LENGTH: Devuelve el número de caracteres en una cadena
Notas Detalladas
Descripción general
$EXTRACT trabaja a nivel de carácter, extrayendo o reemplazando caracteres individuales o subcadenas por posición. A diferencia de $PIECE que trabaja con delimitadores, $EXTRACT usa posiciones numéricas dentro de la cadena.
Extracción básica de caracteres
SET name = "ObjectScript"
// Single character (1-based)
WRITE $EXTRACT(name, 1), ! // O
WRITE $EXTRACT(name, 7), ! // S
// $E shorthand
WRITE $E(name, 1), ! // O
// Character range
WRITE $E(name, 1, 6), ! // Object
WRITE $E(name, 7, 12), ! // Script
// From end
WRITE $E(name, *), ! // t (last char)
WRITE $E(name, *-5, *), ! // Script (last 6 chars)
Modificación con SET $EXTRACT
SET word = "Hello"
// Replace single character
SET $E(word, 1) = "J"
WRITE word, ! // Jello
// Replace range (different length OK)
SET $E(word, 1, 3) = "Mars"
WRITE word, ! // Marslo
// Replace with shorter string
SET word = "Hello World"
SET $E(word, 6, 6) = "-"
WRITE word, ! // Hello-World
Uso de $LENGTH para longitud de cadena
SET str = "ObjectScript"
WRITE $LENGTH(str), ! // 12
// Get last N characters
SET n = 6
WRITE $E(str, $L(str) - n + 1, $L(str)), ! // Script
// Or more concisely
WRITE $E(str, *-5, *), ! // Script
Patrones prácticos
// Check if string starts with a prefix
SET filename = "report_2025.pdf"
IF $E(filename, 1, 7) = "report_" {
WRITE "It's a report file", !
}
// Check file extension
SET ext = $E(filename, *-2, *)
WRITE "Extension: ", ext, ! // pdf
// Pad a string to fixed width
SET num = "42"
SET padded = $E("00000" _ num, *-4, *)
WRITE padded, ! // 00042
// Truncate a string
SET longStr = "This is a very long string"
SET truncated = $E(longStr, 1, 10) _ "..."
WRITE truncated, ! // This is a ...
Referencias de Documentación
3. $REPLACE, $TRANSLATE, $ZSTRIP
Puntos Clave
- $REPLACE: Reemplaza todas las ocurrencias de una subcadena: $REPLACE(string, old, new)
- $TRANSLATE($TR): Reemplazo carácter por carácter: $TR(string, fromChars, toChars)
- Eliminación con $TRANSLATE: Si toChars es más corto, los caracteres de fromChars sin correspondencia se eliminan
- $ZSTRIP: Elimina caracteres por categoría/máscara: $ZSTRIP(string, mask, removeChars, keepChars)
- Máscaras de $ZSTRIP: "<" eliminar al inicio, ">" eliminar al final, "*" eliminar todo, "<>" eliminar en ambos extremos
Notas Detalladas
Descripción general
Estas tres funciones manejan diferentes necesidades de transformación de cadenas: $REPLACE para reemplazo de subcadenas, $TRANSLATE para mapeo carácter a carácter, y $ZSTRIP para eliminar categorías de caracteres.
$REPLACE: Reemplazo de subcadenas
SET str = "Hello World, Hello IRIS"
// Replace all occurrences
WRITE $REPLACE(str, "Hello", "Hi"), !
// Output: Hi World, Hi IRIS
// Case-sensitive
WRITE $REPLACE(str, "hello", "hi"), !
// Output: Hello World, Hello IRIS (no change -- case mismatch)
// Remove by replacing with empty string
WRITE $REPLACE(str, " Hello", ""), !
// Output: Hello World, IRIS
// Replace multi-character sequences
SET path = "C:\Users\Admin\Documents"
WRITE $REPLACE(path, "\", "/"), !
// Output: C:/Users/Admin/Documents
$TRANSLATE: Mapeo carácter por carácter
// Map characters one-to-one
SET str = "Hello World"
WRITE $TRANSLATE(str, "lo", "LO"), !
// Output: HeLLO WOrLd
// $TR shorthand
WRITE $TR(str, "HW", "hw"), !
// Output: hello world
// Delete characters (toChars shorter than fromChars)
SET phone = "(555) 123-4567"
WRITE $TR(phone, "()- ", ""), !
// Output: 5551234567
// ROT13 encoding
SET msg = "Hello"
SET from = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
SET to = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"
WRITE $TR(msg, from, to), !
// Output: Uryyb
// Convert to uppercase (simple ASCII)
SET lower = "hello world"
WRITE $TR(lower, "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"), !
// Output: HELLO WORLD
// Better: use $ZCONVERT(lower, "U") -- see item 6
$ZSTRIP: Eliminación basada en categorías
SET str = " Hello 123 World! "
// Strip leading and trailing whitespace
WRITE $ZSTRIP(str, "<>W"), !
// Output: Hello 123 World!
// Strip all whitespace
WRITE $ZSTRIP(str, "*W"), !
// Output: Hello123World!
// Strip leading whitespace only
WRITE $ZSTRIP(str, "<W"), !
// Output: Hello 123 World! (trailing space preserved)
// Strip all non-numeric characters
SET mixed = "abc123def456"
WRITE $ZSTRIP(mixed, "*A"), !
// Output: 123456 (strips all alpha, leaving digits)
// Strip specific characters
SET data = "###Hello###"
WRITE $ZSTRIP(data, "<>", "#"), !
// Output: Hello (strips # from both ends)
// Common masks:
// "W" = whitespace, "A" = alphabetic, "N" = numeric
// "P" = punctuation, "C" = control characters
// "L" = lowercase, "U" = uppercase, "E" = everything
// Strip all punctuation
SET text = "Hello, World! How are you?"
WRITE $ZSTRIP(text, "*P"), !
// Output: Hello World How are you
Referencias de Documentación
4. Concatenación de cadenas
Puntos Clave
- Operador de concatenación (_): El guión bajo une cadenas: "Hello" _ " " _ "World"
- Sin literales de plantilla: ObjectScript no soporta interpolación de cadenas ni cadenas de plantilla
- Coerción de tipos: Los valores no string se convierten automáticamente al concatenar
- Construcción de cadenas en bucles: Patrón común para construir salida incrementalmente
- $CHAR para caracteres especiales: Use $CHAR(n) para concatenar caracteres no imprimibles
Notas Detalladas
Descripción general
ObjectScript usa el carácter de guión bajo (_) como su operador de concatenación de cadenas. No hay sintaxis de interpolación de cadenas ni literales de plantilla -- toda la construcción de cadenas usa concatenación explícita.
Concatenación básica
SET first = "John"
SET last = "Smith"
// Simple concatenation
SET fullName = first _ " " _ last
WRITE fullName, ! // John Smith
// Multiple concatenations
SET greeting = "Hello, " _ first _ " " _ last _ "!"
WRITE greeting, ! // Hello, John Smith!
// Numeric coercion
SET age = 42
SET msg = first _ " is " _ age _ " years old"
WRITE msg, ! // John is 42 years old
Caracteres especiales con $CHAR
// Newline character
SET crlf = $CHAR(13, 10)
SET multiLine = "Line 1" _ crlf _ "Line 2"
// Tab character
SET tab = $CHAR(9)
SET tsv = "Col1" _ tab _ "Col2" _ tab _ "Col3"
// Double quote within a string
SET quoted = "He said " _ $CHAR(34) _ "hello" _ $CHAR(34)
WRITE quoted, ! // He said "hello"
Construcción de cadenas en bucles
// Build a comma-separated list
SET result = ""
SET sep = ""
FOR i = 1:1:5 {
SET result = result _ sep _ i
SET sep = ","
}
WRITE result, ! // 1,2,3,4,5
// Alternative: build then strip trailing separator
SET result = ""
FOR i = 1:1:5 {
SET result = result _ i _ ","
}
SET result = $E(result, 1, *-1) // Remove trailing comma
WRITE result, ! // 1,2,3,4,5
Concatenación vs WRITE
// WRITE outputs directly (more efficient for display)
WRITE "Name: ", first, " ", last, !
// Concatenation builds a string value (for storage/return)
SET output = "Name: " _ first _ " " _ last
RETURN output
Referencias de Documentación
5. Expresiones regulares
Puntos Clave
- $MATCH(string, regex): Devuelve 1 si la cadena completa coincide con el patrón regex
- $LOCATE(string, regex, start, end, value): Busca una coincidencia regex dentro de la cadena
- Operador de coincidencia de patrones (?): Sintaxis nativa de patrones de ObjectScript (no regex): string ? pattern
- Sintaxis regex ICU: $MATCH y $LOCATE usan la sintaxis de expresiones regulares ICU
- $LOCATE devuelve posición: Devuelve la posición inicial de la coincidencia (0 si no hay coincidencia)
Notas Detalladas
Descripción general
ObjectScript ofrece dos sistemas de coincidencia de patrones: expresiones regulares ICU ($MATCH, $LOCATE) y el operador nativo de coincidencia de patrones de ObjectScript (?). Las expresiones regulares son más potentes y flexibles; el operador nativo es más simple para validaciones básicas.
$MATCH: Coincidencia de cadena completa
// $MATCH tests if ENTIRE string matches the regex
WRITE $MATCH("hello123", "[a-z]+\d+"), ! // 1 (matches)
WRITE $MATCH("hello123!", "[a-z]+\d+"), ! // 0 (! not matched)
// Email validation
SET email = "user@example.com"
WRITE $MATCH(email, "[^@]+@[^@]+\.[^@]+"), ! // 1
// Phone number format
SET phone = "555-123-4567"
WRITE $MATCH(phone, "\d{3}-\d{3}-\d{4}"), ! // 1
// Case-insensitive with (?i)
WRITE $MATCH("Hello", "(?i)hello"), ! // 1
$LOCATE: Búsqueda dentro de cadena
SET text = "The price is $42.50 today"
// Find a number pattern
SET pos = $LOCATE(text, "\d+\.?\d*")
WRITE "Found at position: ", pos, ! // 16
// With start position, end position, and matched value
SET start = 1
SET pos = $LOCATE(text, "\d+\.?\d*", start, .end, .matched)
WRITE "Match: ", matched, ! // 42.50
WRITE "Start: ", pos, " End: ", end, ! // Start: 16 End: 21
// Find all matches in a loop
SET text = "abc 123 def 456 ghi 789"
SET start = 1
FOR {
SET pos = $LOCATE(text, "\d+", start, .end, .matched)
QUIT:pos=0
WRITE "Found: ", matched, " at ", pos, !
SET start = end
}
// Output:
// Found: 123 at 5
// Found: 456 at 13
// Found: 789 at 21
Operador nativo de coincidencia de patrones (?)
// Pattern syntax: count + code
// N = numeric, A = alphabetic, P = punctuation
// E = any character, L = lowercase, U = uppercase
// Exactly 3 digits
WRITE "123" ? 3N, ! // 1
WRITE "12A" ? 3N, ! // 0
// Variable count: .N means "zero or more digits"
WRITE "123" ? .N, ! // 1
WRITE "" ? .N, ! // 1
// 1 or more alpha followed by 1 or more numeric
WRITE "abc123" ? 1.A1.N, ! // 1
// Literal characters in quotes
WRITE "2025-01-15" ? 4N1"-"2N1"-"2N, ! // 1
// US phone: (555) 123-4567
WRITE "(555) 123-4567" ? 1"("3N1") "3N1"-"4N, ! // 1
Referencias de Documentación
6. $ZCONVERT para codificación
Puntos Clave
- $ZCONVERT($ZCVT): Convierte cadenas entre codificaciones y tipos de capitalización
- Conversión de capitalización: $ZCVT(str, "U") mayúsculas, $ZCVT(str, "L") minúsculas, $ZCVT(str, "W") tipo título
- Dirección de codificación: "O" para codificación de salida, "I" para decodificación de entrada
- Codificación HTML: $ZCVT(str, "O", "HTML") convierte < > & " a entidades HTML
- Codificación URL: $ZCVT(str, "O", "URL") codifica caracteres especiales con porcentaje
- Codificación JSON: $ZCVT(str, "O", "JSON") escapa para valores de cadena JSON
- Codificación XML: $ZCVT(str, "O", "XML") convierte para contenido XML/XHTML
Notas Detalladas
Descripción general
$ZCONVERT (abreviado $ZCVT) es una función versátil utilizada para conversión de capitalización y codificación/decodificación de cadenas para varios formatos de salida. Es esencial para desarrollo web, integración de datos y seguridad (prevención de ataques de inyección).
Conversión de capitalización
SET str = "Hello World"
// Uppercase
WRITE $ZCONVERT(str, "U"), ! // HELLO WORLD
// Lowercase
WRITE $ZCONVERT(str, "L"), ! // hello world
// Title case (first letter of each word)
SET str2 = "hello world"
WRITE $ZCVT(str2, "W"), ! // Hello World
// Works with Unicode characters
SET french = "ecole"
WRITE $ZCVT(french, "U"), ! // ECOLE
Codificación HTML (salida)
SET html = "<script>alert('XSS')</script>"
// Encode for safe HTML output
WRITE $ZCVT(html, "O", "HTML"), !
// Output: <script>alert('XSS')</script>
// Decode HTML entities back
SET encoded = "<b>Bold</b>"
WRITE $ZCVT(encoded, "I", "HTML"), !
// Output: <b>Bold</b>
Codificación URL
SET query = "name=John Smith&city=New York"
// Encode for URL
WRITE $ZCVT(query, "O", "URL"), !
// Output: name%3DJohn+Smith%26city%3DNew+York
// Decode URL-encoded string
SET encoded = "Hello%20World%21"
WRITE $ZCVT(encoded, "I", "URL"), !
// Output: Hello World!
Codificación JSON
SET str = "He said ""hello"" and left"
// Encode for JSON string value
WRITE $ZCVT(str, "O", "JSON"), !
// Output: He said \"hello\" and left
// Handles control characters
SET withTab = "Line1" _ $CHAR(9) _ "Line2"
WRITE $ZCVT(withTab, "O", "JSON"), !
// Output: Line1\tLine2
Codificación XML
SET xml = "<tag attr=""value"">Data & more</tag>"
WRITE $ZCVT(xml, "O", "XML"), !
// Output: <tag attr="value">Data & more</tag>
Codificación UTF-8
// Convert to/from UTF-8 bytes
SET str = "Hello"
SET utf8 = $ZCVT(str, "O", "UTF8")
SET back = $ZCVT(utf8, "I", "UTF8")
Referencias de Documentación
7. Escape de caracteres especiales
Puntos Clave
- Duplicar comillas: Incluir una comilla en una cadena duplicándola: "He said ""hello"""
- $CHAR($C): Genera caracteres por código ASCII/Unicode: $C(34) para comilla doble
- $ASCII($A): Obtiene el código numérico de un carácter: $A("A") devuelve 65
- Caracteres de control: Use $CHAR para tabulación (9), nueva línea (10), retorno de carro (13)
- Sin escapes con barra invertida: ObjectScript NO usa \ para secuencias de escape en cadenas
Notas Detalladas
Descripción general
Las cadenas de ObjectScript están delimitadas por comillas dobles. Para incluir caracteres especiales dentro de las cadenas, se duplica el carácter de comilla o se usa $CHAR para generar caracteres por su código de punto. No existen secuencias de escape con barra invertida como en C o JavaScript.
Duplicar comillas
// Embed a double quote by doubling it
SET msg = "He said ""hello"" to everyone"
WRITE msg, !
// Output: He said "hello" to everyone
// Multiple quotes
SET str = "The value is ""42"" not ""43"""
WRITE str, !
// Output: The value is "42" not "43"
// Empty quoted string within a string
SET str = "An empty string is """"."
WRITE str, !
// Output: An empty string is "".
$CHAR y $ASCII
// $CHAR generates characters from code points
WRITE $CHAR(65), ! // A
WRITE $CHAR(97), ! // a
WRITE $CHAR(48), ! // 0
// Multiple characters at once
WRITE $CHAR(72, 101, 108, 108, 111), ! // Hello
// Special characters
SET tab = $CHAR(9)
SET lf = $CHAR(10)
SET cr = $CHAR(13)
SET crlf = $CHAR(13, 10)
SET quote = $CHAR(34)
// $C shorthand
SET pipe = $C(124) // |
// $ASCII returns the code point
WRITE $ASCII("A"), ! // 65
WRITE $ASCII("a"), ! // 97
WRITE $ASCII("0"), ! // 48
// $A shorthand; get specific position
SET str = "Hello"
WRITE $A(str, 1), ! // 72 (H)
WRITE $A(str, 5), ! // 111 (o)
// -1 for position beyond string length
WRITE $A(str, 99), ! // -1
Patrones prácticos de escape
// Building SQL with quoted values (for illustration -- use parameters in practice!)
SET name = "O'Brien"
// In SQL, single quotes are doubled
SET escaped = $REPLACE(name, "'", "''")
WRITE "SELECT * FROM Table WHERE Name = '", escaped, "'", !
// Output: SELECT * FROM Table WHERE Name = 'O''Brien'
// Building JSON manually (prefer %DynamicObject in practice)
SET key = "name"
SET val = "John ""JD"" Doe"
SET json = "{" _ $C(34) _ key _ $C(34) _ ":" _ $C(34) _ $ZCVT(val, "O", "JSON") _ $C(34) _ "}"
WRITE json, !
// Output: {"name":"John \"JD\" Doe"}
// Build a string with mixed special characters
SET header = "Name" _ $C(9) _ "Age" _ $C(9) _ "City"
SET row = "Alice" _ $C(9) _ "30" _ $C(9) _ "NYC"
WRITE header, !
WRITE row, !
// Tab-separated output
Verificación de caracteres
// Check if character is a digit
SET ch = "5"
SET code = $A(ch)
IF (code >= 48) && (code <= 57) {
WRITE ch, " is a digit", !
}
// Check if character is uppercase letter
SET ch = "A"
SET code = $A(ch)
IF (code >= 65) && (code <= 90) {
WRITE ch, " is uppercase", !
}
Referencias de Documentación
Resumen de Preparación para el Examen
Conceptos críticos a dominar:
- $PIECE vs $EXTRACT: $PIECE trabaja con delimitadores, $EXTRACT trabaja con posiciones de caracteres
- SET $PIECE / SET $EXTRACT: Ambos pueden modificar cadenas in situ
- $REPLACE vs $TRANSLATE: $REPLACE reemplaza subcadenas; $TRANSLATE mapea caracteres uno a uno
- Máscaras de $ZSTRIP: Conocer "<" (inicio), ">" (final), "*" (todo), y clases de caracteres (W, A, N, P)
- Direcciones de $ZCONVERT: "O" para codificación de salida, "I" para decodificación de entrada; "U"/"L"/"W" para capitalización
- $MATCH vs $LOCATE: $MATCH prueba la cadena completa; $LOCATE busca dentro de una cadena
- Operador de patrones (?): Sintaxis nativa con códigos (N, A, E, P, L, U) -- diferente de regex
- Escape de comillas: Duplicar el carácter de comilla -- no hay escapes con barra invertida en ObjectScript
- $CHAR/$ASCII: Convertir entre caracteres y códigos numéricos de punto
- $LENGTH con delimitador: $L(str, delim) cuenta piezas, no caracteres
Escenarios comunes de examen:
- Extraer campos de registros delimitados usando $PIECE
- Modificar piezas específicas con SET $PIECE
- Elegir entre $REPLACE y $TRANSLATE para una tarea de transformación
- Eliminar espacios en blanco o caracteres específicos con $ZSTRIP
- Codificar entrada de usuario con $ZCONVERT para HTML para prevención de XSS
- Escribir patrones regex para validación con $MATCH
- Escapar comillas en literales de cadena
- Usar $EXTRACT para obtener subcadenas por posición
Recomendaciones de práctica:
- Analizar mensajes HL7 usando $PIECE con delimitadores ^ y |
- Construir y modificar cadenas delimitadas usando SET $PIECE
- Usar $TRANSLATE para eliminar caracteres no deseados de entrada de usuario
- Practicar $ZSTRIP con diferentes máscaras en varios tipos de cadena
- Codificar y decodificar cadenas con $ZCONVERT para HTML, URL, JSON y XML
- Escribir patrones $MATCH para validación de correo electrónico, teléfono y fecha
- Usar $LOCATE para encontrar y extraer todas las coincidencias de una cadena de texto
- Experimentar con el operador nativo de patrones (?) para validaciones simples